正则表达式模式匹配字符串,后面没有冒号

时间:2016-06-04 06:34:09

标签: regex pcre

使用正则表达式,我尝试匹配满足以下条件的任何字符串(按显示的顺序):

  • 包含美元符号$;然后
  • 至少一封信[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_]*)([^:])

2 个答案:

答案 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"

但是,即使我们从此字符串中删除冒号,它仍然不匹配,因为它包含不允许的引号。

Regex101