- 仅由数字(0到9)组成 - @后跟a或b。
请注意,空字符串是有效的。因此,这些是有效的:" ","123","@a","1@b","@a123",而这些是无效的:"X","@","@@","@1","a","@aa"。
我想构建一个正则表达式,以匹配有效情况并且不匹配无效情况(失败)。但需要注意以下几点:
- 我正在使用从字符串开头开始搜索的匹配函数,但不强制进行完全匹配... 我希望避免这种情况,并且请不要使用$来匹配字符串的结尾。这最多只是一个解决方法,我们知道在检查字符串的结尾位置或剩余字符串的内容之前,该字符串不会匹配。我必须补充说,我不能使用这个方法,因为我的玩具语言可以用于更广泛的语言,给定的字符串不会在那里结束...这不会破坏我们在检查字符串的结尾位置或剩余字符串的内容之前就知道该字符串不会匹配我们的语法的事实。 - 如果我们匹配@并且在它之后匹配a或b失败,那么没有必要进行任何回溯,因为整个字符串将无法匹配给定的语法。 - 我需要正则表达式失败而不是只匹配部分字符串。
我想编写的正则表达式如下:
(@![ab]|[0-9]|!(?!))*
以我的想象为基础,加入了
!
字符,如果遇到该字符,则不允许回溯。如果剩余的字符串与剩余的模式不匹配,则整个模式将无法匹配整个字符串。注意,如果最后一个备选项是!(?!)
,则遇到该字符时整个模式将失败。我研究了原子组和贪婪量词,但我无法看出如何使用它们来模拟所需的结果。
以下是设置测试环境的简单方法:
pip install regex &&
cat <<EOF > ./test_regex.py
#!/usr/bin/env python
import sys, regex
def check_regex(rx, *strings):
for string in strings:
m = regex.match(rx, string)
print("match %-4s for %r" %
("Fail" if m is None else m.end(), string))
check_regex(*sys.argv[1:])
EOF
chmod +x test_regex.py
接下来是测试命令及其期望输出,请填写MYSTERY_REGEX:
./test_regex.py MYSTERY_REGEX "" "123" "@a" "1@b" "@a123" "X" "@" "@@" "@1" "a" "@aa"
match 0 for ''
match 3 for '123'
match 2 for '@a'
match 3 for '1@b'
match 5 for '@a123'
match Fail for 'X'
match Fail for '@'
match Fail for '@@'
match Fail for '@1'
match Fail for 'a'
match Fail for '@aa'
请注意,
(@[ab]|[0-9])*$
是一个简单的答案,可以产生正确的输出,但它使用了一个明确被禁止在此处使用的最后一个$
。那么,您能否消除对完全匹配的需求?如果不能,能否详细说明为什么不可能?
(@[ab] | [0-9])* +(?![@0-9])
如果您想匹配字符串的结尾,则可以再次添加它:(@[ab] | [0-9])* +(?!。)
- ChrisoLosoph