正则表达式中的问号和x代表什么意思?

7

我正在学习Atom的语法高亮/语法规则,它们大量使用JS正则表达式,并在python语法文件中发现了一个陌生的模式。

该模式以(?x)开头,这是一种对我来说不熟悉的正则表达式。我在一个在线正则表达式测试器中查找了它,似乎显示它是无效的。我的初步想法是它表示一个可选的左括号,但我认为这里的括号应该要转义。

这个模式只在Atom的coffeescript语法中有意义吗?还是我忽略了某个正则表达式的含义?

(我相信Atom的语法来源于textmate语言文件,该模式也出现在其中)。


Javascript不支持冗长的正则表达式修饰符。 - Wiktor Stribiżew
2个回答

4
如果在Python中处理该正则表达式,它将使用“verbose”标志进行编译。
来自Python re文档
(?aiLmsux)
(来自集合'a'、'i'、'L'、'm'、's'、'u'、'x'的一个或多个字母。)该组匹配空字符串;字母设置相应的标志:re.A(仅ASCII匹配)、re.I(忽略大小写)、re.L(区域设置依赖)、re.M(多行)、re.S(点匹配所有)和re.X(详细模式),用于整个正则表达式。(这些标志在模块内容中描述。)如果您希望将标志包含在正则表达式中,而不是将标志参数传递给re.compile()函数,则此功能非常有用。

1
谢谢,我原以为它使用的是JS正则表达式,但进一步查看后发现Atom已经修改了自己的正则表达式引擎,很可能包含了这个功能。 - beardc

1
JavaScript正则表达式引擎不支持x修饰符的VERBOSE模式,无论是内联还是普通模式。
请参阅rexegg.com上的自由间距:x(除JavaScript之外)
默认情况下,正则表达式字符串中的任何空格都指定要匹配的字符。在您可以在多行上编写正则表达式字符串的语言中,换行符也指定要匹配的文字字符。因为您不能插入空格来分隔具有不同含义的组(就像您用英语写作时在短语和段落之间所做的那样),所以正则表达式可能很难读取...幸运的是,许多引擎支持自由间距模式,允许您调整正则表达式的排版。例如,您可以在标记之间添加空格。你也可以称它为whitespace modecomment mode或者verbose模式。
这是Python中的演示效果
import re
regex = r"""(?x)
\d+                # Digits
\D+                # Non-digits up to...
$                  # The end of string
"""
print(re.search(regex, "My value: 56%").group(0)) # => 56%

1
我认为示例和备用文档参考增加了问题的可读性,所以我会保留它。我的主要困扰是识别冗长模式标志,因此任何一个答案在这方面都是有帮助的。谢谢。 - beardc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接