为什么这个正则表达式匹配任何东西

时间:2014-03-03 10:05:08

标签: regex

正则表达式

\\(?:[A-Za-z@]+|.)

用于Texworks中的乳胶语法高亮显示。

为什么此表达式与\之外的任何内容匹配?据我所知,前瞻不匹配任何东西(仅检查条件是否为真)。此表达式用于匹配Latex命令,这些命令通常为\command,但也具有特殊字符\%,\|,...,因此正则表达式中为.

有人可以解释原因吗?

3 个答案:

答案 0 :(得分:2)

在给定的正则表达式中,

\\(?:[A-Za-z@]+|.)

()是一个群组运营商。正则表达式将组操作符内的条目视为一个单元。

因此正则表达式接受像

这样的字符串

\.\|\a等。

此外,正则表达式不会接受\

答案 1 :(得分:2)

?:是一个非捕获组。 ?=是一个先行者。 (?:)的原因是|适用于[A-Za-z@].。如果没有(?:)|将适用于\\[A-Za-z@].。这将匹配任何字符串(因为.将始终匹配),而不仅仅是具有\的字符串(更多关于匹配的详细信息如下)。由于这只是指定|范围的逻辑分组,因此无需保留捕获组,这就是使用?:的原因。

看看正则表达式:

\\表示开始与\匹配。现在,字符串不需要以\开头匹配。正则表达式将匹配\abc,但它也会匹配字符串a\abc,在这两种情况下匹配结果将为\abc

[A-Za-z@]+ - +表示一个或多个。因此它匹配[]中的一个或多个字符。这意味着\a\abc\a@b等字符串将匹配

|表示OR。

.是任何单个字符(默认情况下不是换行符)。这意味着将匹配\a\#\,等字符串。因此\之后的第一个字符可以是任何字符,但如果它与[A-Za-z@]+不匹配,则匹配将仅匹配第一个字符。例如,\#a仅匹配\#

匹配示例,其中突出显示匹配结果:

  • \abc@
  • AB \abc@
  • AB \abc@#一个
  • \# ABC @
  • AB \# ABC @#一个

不匹配的字符串示例(请注意,如果移除(?:),这些字符串将匹配)

  • \
  • ABCABC

答案 2 :(得分:1)

该模式仅匹配\及其后面的任何字符。

  1. 模式匹配字符\字面
  2. 接下来,您有一个非捕获组(?:[A-Za-z@]+|.)
  3. 您还有另一个组.匹配任何字符(换行符除外)。
  4. 前面没有预测,here's a list of expressions可供参考。

    enter image description here

相关问题