Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 区分和测试正则表达式变体_Regex_Parsing_Regular Language - Fatal编程技术网

Regex 区分和测试正则表达式变体

Regex 区分和测试正则表达式变体,regex,parsing,regular-language,Regex,Parsing,Regular Language,正则表达式的几个实现在微妙的方面彼此不同,这是我尝试使用它们时产生很多混乱的原因 其中大多数差异包括与字符是否转义相关的语义。这通常是括号的问题,但也适用于花括号和其他括号。这可能是实现所在的语言或环境的语法造成的。例如,如果$符号表示某种语言中的变量名,可以预期用该语言表示的正则表达式将需要将“行尾”锚点转义到\$或类似的位置。但在这一点上让人困惑的是如何表示实际的美元符号。我相信Perl通过在前向斜杠/中包装正则表达式来解决这个问题 同样,特定字符本身也有转义,例如非打印字符,如\n和\t。

正则表达式的几个实现在微妙的方面彼此不同,这是我尝试使用它们时产生很多混乱的原因

其中大多数差异包括与字符是否转义相关的语义。这通常是括号的问题,但也适用于花括号和其他括号。这可能是实现所在的语言或环境的语法造成的。例如,如果
$
符号表示某种语言中的变量名,可以预期用该语言表示的正则表达式将需要将“行尾”锚点转义到
\$
或类似的位置。但在这一点上让人困惑的是如何表示实际的美元符号。我相信Perl通过在前向斜杠
/
中包装正则表达式来解决这个问题

同样,特定字符本身也有转义,例如非打印字符,如
\n
\t
。还有一些类似的通用字符组,比如数字的
\d
\s
和空白的
\w
,我刚刚了解到这些字符组包括下划线和数字。我发现自己曾多次尝试将
\a
用于“字母”组,但最终只匹配了贝尔字符0x07

很明显,除了有人做所有的艰苦工作并将结果放入一个组织良好的表中之外,没有一个简单的、一次性的解决方案可以了解大量正则表达式实现所提供的特性和语法的所有差异。这正是一个例子,但它当然没有涵盖我自己广泛使用的几个程序,包括
vim
sed
,Notepad++,Eclipse,信不信由你,MS Word(至少2010版,我怀疑2007版也有这个,他们称之为“通配符”)也有一个简单的正则表达式实现

我想我想要的是尽可能地懒惰(在某种意义上),通过应用一个(或几个)查询,尝试想出一种方法来确定任何给定正则表达式实现的“转义设置”是什么

我想我可以制作一个包含测试用例的文件,以及一个巨大的正则表达式查询,并以某种方式对其进行设计,这样运行一次就可以准确地告诉我以后需要使用什么语法,而不用再怀疑自己了。(而不是必须编辑文件并使用多个查询来找出同一件事,而这件事在一段时间后会变得非常陈旧)

如果没有其他人试图建造这样一个怪物,我可以自己承担这项任务。如果可能的话。这可能吗

我试图给出一个例子(只是想弄清楚下线锚是
$
还是
\$
),但在每种情况下,我都必须使用大量不同的搜索/替换查询来确定程序将如何响应输入

编辑:我想出了一些使用捕获和回溯的方法。我得再努力一点

更新:Notepad++没有实现通常由管道表示的OR操作符。Word的“通配符”也是一个糟糕的替代品,它没有
|
*
。我相当肯定,缺少任何正则表达式操作符(union、concat、star)意味着它无法生成正则语法,因此排除了这两个操作符

我可以创建如下输入文件:

$
*
]
EOL
和查询

(\$)|(\*)|(\[)|($)
替换为

escDollar:\1:escStar:\2:escSQBrL:\3:Dollar:\4:
产生的结果为(假设未开槽的管道为组,未开槽的管道为或)

我在
vim
中运行了这个。此输出将演示与它旁边指定的每个项目匹配的单个字符,即转义美元符号项目与实际美元符号字符匹配,而不是结尾处的非转义美元符号项目

很难看出
$
锚点的情况,因为它匹配零个字符,但找到解决方案应该不难。此外,这不是一个常见的错误。我特别担心的是管道和管道以及不同的括号。当您有4种不同的类型时,有2^4种转义版本和非转义版本的组合,您可以使用它们。这种反复试验是可怕的

这个输出不是很难一目了然地解析,而且作为脚本的一部分也很容易处理。剩下的一个突出问题是弄清楚是否需要逃出帕伦和管道。因为整个东西的功能都取决于它们

这似乎需要多个查询。通过巧妙设计的反斜杠、paren和管道的混乱组合,可以找出初始查询的组合(毕竟只有4种可能性),然后根据它选择后续的矩阵生成器查询

类似这样的情况表明它可以工作:

(e)
(f)
质疑

\((f\))|\|\((e\))
取代

\1:\2
将产生:

  • :(e
    如果转义参数为组且转义管道为或
  • :e)
    如果parens是组,而逃逸管道是或
  • (f:
    如果转义参数为组且管道为或
  • f):
    如果parens是组而管道是或

但我还是不喜欢这样,因为它需要对第二组输入进行第二次查询。设置太多。我可以复制4份“矩阵”的东西

本页上的表格很好地总结了regex实现中可用的功能:


本页上的表格很好地总结了在哪些正则表达式实现中可用的功能:


可能的重复我会使用文档而不是测试,然后使用测试作为后续。是的,我
\1:\2