使用正则表达式,我尝试匹配满足以下条件的任何字符串(按显示的顺序):
- 包含美元符号
$
;那么 - 至少一个字母
[a-zA-Z]
;那么 - 零个或多个字母、数字、下划线、句点(点)、左括号和/或右括号
[a-zA-Z0-9_.\[\]]*
;那么 - 一个管道符
|
;那么 - 一个符号
@
;那么 - 至少一个字母
[a-zA-Z]
;那么 - 零个或多个字母、数字和/或下划线
[a-zA-Z0-9_]*
;那么 - 零冒号
:
换句话说,如果在字符串末尾找到冒号,那么它应该不算作匹配。
以下是一些有效匹配的示例:
$tmp1|@hello
$x2.h|@hi_th3re
Valid match$here|@in_the middle of other characters
以下是一些无效匹配的示例:
$tmp2|@not_a_match:"because there is a colon"
$c.4a|@also_no_match:
以下是我尝试过的一些模式:
(\$[a-zA-Z])([a-zA-Z0-9_.\[\]]*)(\|@)([a-zA-Z][a-zA-Z0-9_]*(?!.[:]))
(\$[a-zA-Z])([a-zA-Z0-9_.\[\]]+)?(\|@)([a-zA-Z][a-zA-Z0-9_]*(?![:]))
(\$[a-zA-Z])([a-zA-Z0-9_.\[\]]+)?(\|@)([a-zA-Z][a-zA-Z0-9_]*)([^:])
最佳答案
此模式将满足您的需要
\$[A-Za-z]+[\w.\[\]]*[|]@[A-Za-z]+[\w]*+(?!:)
<强> Regex Demo
我使用所有格量词来减少使用 [\w]*+
的回溯。您还可以使用原子组而不是所有格量词,例如
\$[A-Za-z]+[\w.\[\]]*[|]@[A-Za-z]+(?>[\w]*)(?!:)
注意
\w => [A-Za-z0-9_]
关于正则表达式模式匹配后面不跟冒号的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37627170/