我必须创建一个正则表达式来满足这个条件:
- 单词可以以非强制性_ 开头
- 后面跟着[a-zA-Z]
- 接[a-zA-Z0-9_]—0次或以上
- 不能以_ 结尾
我已经实现了这个解决方案:
_*[a-zA-Z][a-zA-Z0-9_]*[^_]$
这个正则表达式可以检测如下变量:
try_it
但是它不能检测如下变量:
x, y, z
这个正则表达式将用于词法分析
可接受:
a100__version_2
_a100__version2
x
y
z
非接受:
100__version_2
a100__version2_
_100__version_2
a100--version-2
如果支持反向查看:
^_?[a-zA-Z][a-zA-Z0-9_]*$(?<!_)
^
字符串 起始_?
匹配可选的下划线[a-zA-Z0-9_]*
匹配0+次所列字符$
字符串结束(?<!_)
负向后看,断言不是_
直接到左边
[a-zA-Z]
匹配单个字符a- za -z查看正则表达式演示。
或使用_*
匹配单词字符和0个或多个前导下划线,如问题中的模式:
^_*[a-zA-Z]w*$(?<!_)
查看另一个正则表达式演示。
这个在匹配你接受的单词时可能会派上用场:
^_?[a-zA-Z](?:[a-zA-Z0-9_]+[^_])?$
正则表达式的解释:
^
:字符串符号_?
:可选下划线[a-zA-Z]
: a字母(?:[a-zA-Z0-9_]+[^_])?
:不以下划线结尾的可选字符集$
:结束字符串符号
点击这里查看演示。
可选注意:如果您只允许最后一个非下划线字符为字母数字字符,您可以将[^_]
更改为[a-zA-Z0-9]
。
^_?= =比;可以以非强制性_
开头[a-zA-Z] = =比;然后是[a-zA-Z](也满足下两个条件,因此?下图)
[ (- za - z0 - 9 _] * [a-zA-Z0-9] ) ?$ = =比;后面跟着[a-zA-Z0-9_]—0次或以上,并且不能以_
结尾…将所有这些放在一起进行测试,如下所示:
Mac_3.2.57$echo "a100__version_2" | grep '^_?[a-zA-Z]([a-zA-Z0-9_]*[a-zA-Z0-9])?$'
a100__version_2
Mac_3.2.57$echo "_a100__version2" | grep '^_?[a-zA-Z]([a-zA-Z0-9_]*[a-zA-Z0-9])?$'
_a100__version2
Mac_3.2.57$echo "x" | grep '^_?[a-zA-Z]([a-zA-Z0-9_]*[a-zA-Z0-9])?$'
x
Mac_3.2.57$echo "y" | grep '^_?[a-zA-Z]([a-zA-Z0-9_]*[a-zA-Z0-9])?$'
y
Mac_3.2.57$echo "z" | grep '^_?[a-zA-Z]([a-zA-Z0-9_]*[a-zA-Z0-9])?$'
z
Mac_3.2.57$echo "100__version_2" | grep '^_?[a-zA-Z]([a-zA-Z0-9_]*[a-zA-Z0-9])?$'
Mac_3.2.57$echo "a100__version2_" | grep '^_?[a-zA-Z]([a-zA-Z0-9_]*[a-zA-Z0-9])?$'
Mac_3.2.57$echo "_100__version_2" | grep '^_?[a-zA-Z]([a-zA-Z0-9_]*[a-zA-Z0-9])?$'
Mac_3.2.57$echo "a100--version-2" | grep '^_?[a-zA-Z]([a-zA-Z0-9_]*[a-zA-Z0-9])?$'