【问题标题】:Regular Expression to match only nonescaped string正则表达式仅匹配非转义字符串
【发布时间】:2011-03-12 22:27:00
【问题描述】:

一段时间以来,我一直在抨击这个。我需要一个正则表达式来匹配一个字符串,除非它没有被转义。例如,这个正则表达式需要匹配<string>\\<string>,而不是\<string>,以及它之前的任意数量的转义(因此,匹配偶数个转义,而不是奇数)。

理想情况下,一切都无关紧要,因此我正在寻找的这个美妙的正则表达式小花絮可以被任何人用来在任何表达式前面打耳光,只返回正确的非转义字符串。这个正则表达式必须在 PHP 中起作用。

理论上,这应该适用于前两个级别的转义,但它不起作用:

(?<!\\(?<!\\\\))

此外,该方法必须非常大才能处理所有可能长度的转义字符。

更具体地说,我在 preg_replace() 中使用了这个正则表达式。这样做是为了对 quake3 Arena 玩家别名进行脱色,使用另一个正则表达式来匹配着色字符串。基本上,我正在寻找一个匹配^&lt;alphanumeric-char&gt;\\^&lt;alphanumeric-char&gt;,但不匹配\^&lt;alphanumeric-char&gt; 的正则表达式。

一个例子:

$find = "^3Foo^7bAR\^7kicks\\^bass";

$string = preg_replace('<regex>', '', $find);

应该返回$string = "Foobar\^7kicks\ass"

【问题讨论】:

  • 你是如何使用这个正则表达式的? preg_match_all? preg_replace?能否提供代码示例?
  • 您需要用分隔符(通常为/)将模式包围起来,以便在第二个分隔符之后添加修饰符。
  • 不应该是FoobAR\^7kicksbass吗?
  • @Dakota:不用等。它应该是FoobAR\^7kicks\^bass,因为"\\" 评估为单个\‍
  • 已修复...实际上应该将 \\^b 评估为 \,因为这是 quake3 arena 在从这些标签中着色时所做的事情。

标签: php regex escaping


【解决方案1】:
'~\\\\.(*SKIP)(*FAIL)|<string>~'

简洁明了。

【讨论】:

  • 最近的一个!我只需要再次遍历字符串并清除 //'s。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 2012-06-05
  • 2013-12-25
相关资源
最近更新 更多