使用正则表达式,我尝试匹配满足以下条件的任何字符串(按显示顺序):
- 包含一个美元符号
$
; 则 - 至少一个字母
[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]*+(?!:)
正则表达式演示
我正在使用所有格量词来减少回溯,使用 [w]*+
.您还可以使用原子组而不是所有格量词,例如
$[A-Za-z]+[w.[]]*[|]@[A-Za-z]+(?>[w]*)(?!:)
注意
\w => [A-Za-z0-9_]
我在正则表达式 101 中测试了您的第三种模式,它似乎工作正常:
^.*($[a-zA-Z])([a-zA-Z0-9_.[]]+)?(|@)([a-zA-Z][a-zA-Z0-9_]*)([^:]).*$
我需要对正则表达式进行的唯一更改才能使其正常工作是在正则表达式的开头和结尾添加^
和$
锚点。 我还允许你的模式作为子字符串出现在一个较大字符串的中间。
顺便说一下,您将以下示例作为不应匹配的字符串:
$tmp2|@not_a_match:"because there is a colon"
但是,即使我们从此字符串中删除冒号,它仍然不匹配,因为它包含不允许的引号。