正则表达式用于通配符字符 (*) 搜索

4
我正在尝试编写一个正则表达式,它可以在字符串的开头或结尾使用通配符(*),但不能在其他字符之间。最多允许一个*,可以有任意数量的其他字符。
有效输入列表:
  • *abc
  • abc*
  • *abc*
  • a*b*c
  • *
*
A*
*A
AB*
*AB
A
AB
ABC
1
*1
1*

*12
12*
123

无效输入列表:

**
A**
**A
A*A
*A*
*AB*
*A*B*
1**
**2
*1*
*1*2

我想出下面的正则表达式。
^(?!(?:.*\*){2})[a-zA-Z0-9*]+$

除了A*A这种情况外,它适用于所有条件。我正在尝试修复它,但尚未成功。请帮忙修复。


^(?!.*\*\*)[a-zA-Z0-9,\s*]+$?请参见https://regex101.com/r/jE0txh/1 - Wiktor Stribiżew
@Wiktor Stribiżew - 你的正则表达式匹配了像AA,A*这样的表达式,它们是无效输入的一部分。你能帮我修复一下吗? - Jackson
1
(^\*?[a-zA-Z0-9]*$)|(^[a-zA-Z0-9]*\*?$)... 试着用这个。 - GolamMazid Sajib
1
啊,你的示例字符串应该用换行符而不是逗号来写,对吧?只需添加 (?!.*\b\*\b) 前瞻,^(?!(?:.*\*){2})(?!.*\b\*\b)[*a-zA-Z0-9]+$ - Wiktor Stribiżew
@GolamMazid Sajib,@Wiktor Stribiżew 你们上面提到的表达式都按预期工作。 - Jackson
1个回答

2
为了使任何输入中出现在字母之间的 * 无效,您可以添加一个 (?!.*\b\*\b) 的前瞻。 \b\*\b 模式匹配单词字符(字母、数字或 _)之间的 *
因此,您可以使用:
^(?!(?:.*\*){2})(?!.*\b\*\b)[*a-zA-Z0-9]+$
               ^^^^^^^^^^^^

请查看正则表达式演示

请注意,如果您使用第一个前瞻模式和对比原则,可以使其更加高效(如果您需要在线测试,请记得添加\n[^*\n],因为您在那里针对的是单个多行字符串,而不是多个字符串):

^(?!(?:[^*]*\*){2})(?!.*\b\*\b)[*a-zA-Z0-9]+$
    ^^^^^^^^^^^

详细信息

  • ^ - 字符串的开头
  • (?!(?:.*\*){2}) - 负向先行断言,如果当前位置右侧有两个以上的任意0+个非换行符字符,然后是*,则匹配失败
  • (?!.*\b\*\b) - 负向先行断言,如果当前位置右侧有任意0+个非换行符字符,然后是用单词字符括起来的*,则匹配失败
  • [*a-zA-Z0-9]+ - 匹配1个或多个ASCII字母数字字符或*
  • $ - 字符串的结尾。

1
这个按预期完美地运行。感谢解释..!! - Jackson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接