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