regex 无法识别模式的正则表达式

yv5phkfx  于 2022-12-05  发布在  其他
关注(0)|答案(2)|浏览(124)

我想创建一个正则表达式,它可以识别一些模式,而不识别一些模式。

_*[a-zA-Z][a-zA-Z0-9_][^-]*.*(?<!_)

我要识别的模式示例:

a100__version_2
_a100__version2

我不想识别的模式样本:

100__version_2
a100__version2_
_100__version_2
a100--version-2

正则表达式对所有这些都有效,除了下面这一个:

a100--version-2

所以我不想用破折号。
我尝试了_*[a-zA-Z][a-zA-Z0-9_][^-]*.*(?<!_),因此问题位于[^-]

blpfk2vs

blpfk2vs1#

您可以这样编写模式,但是[^-]*也可以匹配换行符和空格。
不匹配换行符和空格,并且至少匹配2个字符:

^_*[a-zA-Z][a-zA-Z0-9_][^-\s]*$(?<!_)

Regex demo
或者仅匹配单词字符,匹配至少重复\w*零次或多次的单个字符:

^_*[a-zA-Z]\w*$(?<!_)
  • ^字符串开头
  • _*匹配可选下划线
  • [a-zA-Z]匹配单个字符a-zA-Z
  • \w*匹配可选单词字符(或[a-zA-Z0-9_]*
  • $字符串结束
  • (?<!_)在字符串末尾的左侧Assertnot _

Regex demo

qmelpv7a

qmelpv7a2#

要从正则表达式中排除短划线,可以在[^-]字符类后使用负lookaheadAssert(?!-)。这将确保正则表达式不匹配[^-]字符类后的任何短划线。
下面是排除破折号的正则表达式的更新版本:
[a-zA-Z]a-zA-Z0-9_.*(?〈!)
这个正则表达式应该匹配您想要识别的模式,并排除您不想要识别的模式。
下面是这个正则表达式如何工作的一些示例:

a100__version_2   // matches
_a100__version2   // matches
100__version_2    // does not match
a100__version2_   // does not match
_100__version_2   // does not match
a100--version-2   // does not match

相关问题