RegEx与管道和IP无法正常工作

时间:2014-07-04 15:14:04

标签: regex

RegEx:

^([0-9\.]+)\Q|\E([^\Q|\E])\Q|\E

与字符串不匹配:

1203730263.912|12.66.18.0|

为什么?

2 个答案:

答案 0 :(得分:2)

From PHP docs

\Q\E可用于忽略模式中的regexp元字符。

For example:

\w+\Q.$.\E$将匹配一个或多个单词字符,后跟文字.$.并锚定在字符串的末尾。

你的正则表达式应该是,

^([0-9\.]+)\Q|\E([^\Q|\E]*)\Q|\E

OR

^([0-9\.]+)\Q|\E([^\Q|\E]+)\Q|\E

您忘记在+之后添加[^\Q|\E]。没有+,它匹配单个字符。

DEMO

<强>解释

  • ^起点。
  • ([0-9\.]+)捕获数字或点一次或多次。
  • \Q|\E在PCRE中,\Q\E称为开始序列。当字符包含在该块中时,它会逐字处理任何字符。因此,该块中的|符号告诉正则表达式引擎匹配文字|
  • ([^\Q|\E]+)捕获任何不属于|次的字符。
  • \Q|\E匹配文字管道符号。

答案 1 :(得分:1)

接受的答案似乎有点不正确,所以我想为将来的读者解决这个问题。

如果您还不知道,使用\Q\E可确保\Q ... \E之间的任何字符都按字面匹配,而不是解释为元字符通过正则表达式引擎。

首先,最重要的是,\Q\E 在括号中的字符类[]中可用。

[^\Q|\E]  # Incorrect
[^|]      # Correct

其次,你没有用量词跟随那个班级。使用它,正确的语法是:

^([0-9.]+)\Q|\E([^|]+)\Q|\E

尽管如此,将其写成:

更为简单
^([0-9.]+)\|([^|]+)\|