用于匹配php';s常量定义


Regular expression for matching php's constant definition

我编写了一个正则表达式来匹配php的常量定义。

示例:

define('Symfony∞DI', SYS_DIRECTORY_PUBLIC . SYS_DIRECTORY_INCLUDES . SYS_DIRECTORY_CLASSES . SYS_DIRECTORY_EXTERNAL . 'symfony/di/');

这是正则表达式:

define'(('"|'')+(['w-'.-∞]+)+('"|'')+(,)+(('s)+('"|'')+(['w-('')-''"-'.-∞-'s-('')-'/]+)+('"|'')|((['w-'s-'.-∞-('')-'/]+)))');

当我使用ActionScript执行时,它运行良好。但当我用C#执行时,它会给我以下错误:

parsing "define'(('"|'')+(['w-'.-∞]+)+('"|'')+(,)+(('s)+('"|'')+(['w-('')-''"-'.-∞-'s-('')-'/]+)+('"|'')|((['w-'s-'.-∞-('')-'/]+)))');" - Cannot include class 's in character range.

你能帮我解决这个问题吗?

您似乎在以一种完全复杂的方式使用正则表达式:

  1. 字符类:-是特殊的,它在那里计算一个区间;我想你有一个排序反转,.Net不处理它,而PHP处理它(或者PHP中的排序顺序不同)。引用第一个例子,您的字符类应该读['w.∞]而不是['w-.-∞]

  2. 不需要在's周围放置组:'s+,而不是('s)+;类似地使用,而不是(,)

  3. '在正则表达式中并不特殊,如果您想匹配两个字符,请使用字符类,而不是组+替代:[''"]而不是(''|'")——请注意,"只有在双引号字符串中才转义;

  4. 正则表达式没有锚定在开头,看起来您希望在输出的开头匹配define^define而不是define

1。可能是你问题的根源。

用以上所有内容重写正则表达式可以得到以下结果(用双引号):

"^define'((['"']['w.∞]+['"'],('s+['"']+['w''".∞'s''/]+)+['"']|(['w's.∞''/]+))');"

这看起来绝对不会匹配你的输入。。。

试试这个:

"^define'('s*([''"])['w.∞]+'1's*,'s*(['w/]+('s*'.'s*['w/]+)*'s*');$"

请参阅fge对您遇到的错误的回答。在不知道字符串要做什么并且不与原始字符串偏离太多的情况下,这里有一个替代正则表达式:

define'('s*(["'])'s*['w.∞]+'s*'1(?:'s*[.,]'s*(["']?)'s*['w/]+'s*'2)*'s*');

define
'(
  's* (["'])
  's* ['w.∞]+
  's* '1
  (?:
    's* [.,]
    's* (["']?)
    's* ['w/]+
    's* '2
  )*
  's*
');