Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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_Computer Science_Regular Language_Computation Theory - Fatal编程技术网

Regex 你能找出哪个输入字符与正则表达式的哪个部分匹配吗?

Regex 你能找出哪个输入字符与正则表达式的哪个部分匹配吗?,regex,computer-science,regular-language,computation-theory,Regex,Computer Science,Regular Language,Computation Theory,我正在尝试构建一个工具,它使用类似正则表达式的东西来查找字符串(而不是文本字符串)中的模式,但现在这并不重要。我熟悉自动机理论,也就是说,我知道如何实现基本的正则表达式匹配,如果字符串与我的正则表达式匹配,我会以教科书的方式模拟自动机,输出true或false 假设我对bs之前的所有内容都感兴趣,没有比bs之前更多的内容,那么,这个正则表达式:a[^a]*b。但我不只是想知道我的字符串是否包含这样的部分,我想得到a作为输出,这样我就可以检查它了记住,我实际上并不是在处理文本 总结:假设我用括号标

我正在尝试构建一个工具,它使用类似正则表达式的东西来查找字符串(而不是文本字符串)中的模式,但现在这并不重要。我熟悉自动机理论,也就是说,我知道如何实现基本的正则表达式匹配,如果字符串与我的正则表达式匹配,我会以教科书的方式模拟自动机,输出true或false

假设我对bs之前的所有内容都感兴趣,没有比bs之前更多的内容,那么,这个正则表达式:a[^a]*b。但我不只是想知道我的字符串是否包含这样的部分,我想得到a作为输出,这样我就可以检查它了记住,我实际上并不是在处理文本

总结:假设我用括号标记a,如:a[^a]*b,并在输入字符串bcadacb上运行它,然后我希望第二个a作为输出

或者,更一般地说,可以找出输入字符串中的哪些字符与正则表达式的哪个部分匹配吗?在文本编辑器中是如何实现的?他们至少知道比赛从哪里开始,因为他们可以突出显示比赛。我必须使用回溯方法,还是有一种更聪明、计算成本更低的方法


编辑:可能不需要正确的反向引用,即使用参数捕捉和使用\1引用等。我知道回溯引用确实引入了回溯或类似的需求,使问题IIRC NP变得困难。本质上,我的问题是:没有反向引用的捕获部分的计算成本是否比正确的反向引用低?

为匹配构建DFA后,在正则表达式中的左括号后标记与第一个状态对应的所有状态。访问这样的状态时,保存当前输入字符的索引;访问与右括号对应的状态时,也保存索引。
当达到接受状态时,输出两个索引。我不确定这是否是文本编辑器中使用的算法,但我会这样做

大多数文本编辑器通过使用回溯算法来实现这一点,在这种情况下,记录匹配位置很容易添加

通过使用括号位置信息扩充状态列表,也可以使用直接NFA模拟。这可以通过保持线性时间保证的方式来实现。看


Timos的答案是正确的,但您不能标记DFA状态,因为DFA状态对应于可能的NFA状态的集合,因此一个DFA状态可能表示通过paren的可能性,但也可能是其他状态,如果结果不是这样,则将其记录为事实是不正确的。您确实需要进行NFA模拟。

为什么不能说a[^a]*b,然后查看每个捕获以了解发生了什么?