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
Python 带嵌套“的正则表达式”;[quot;_Python_Regex - Fatal编程技术网

Python 带嵌套“的正则表达式”;[quot;

Python 带嵌套“的正则表达式”;[quot;,python,regex,Python,Regex,我熟悉正则表达式,但这个复杂的例子让我很困惑。我试图理解这行代码在做什么: r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/([gim]+\b|\B)' 它是一个试图检测正则表达式的代码片段,例如:/\s+/。我理解它,直到嵌套的[,\[,以及(对应项) (我需要将这段代码从Python移植到Java,在理解上面的工作原理以及为什么它不能像Java那样工作时遇到问题。)下面是一个分解版本,可能会有所帮助: / # Mat

我熟悉正则表达式,但这个复杂的例子让我很困惑。我试图理解这行代码在做什么:

r'/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/([gim]+\b|\B)'
它是一个试图检测正则表达式的代码片段,例如:
/\s+/
。我理解它,直到嵌套的
[
\[
,以及
对应项)


(我需要将这段代码从Python移植到Java,在理解上面的工作原理以及为什么它不能像Java那样工作时遇到问题。)

下面是一个分解版本,可能会有所帮助:

/                      # Match an opening slash
(                      # Followed by one or more...
  \\.                  #    Backslash followed by any character
  |                    #   or...
  [^[/\\\n]            #    Something that's not a [, /, \, or newline
  |                    #   or...
  \[                   #    A literal [, followed by any number of...
    (
      \\.              #     backslashes followed by any character
      |                #     or...
      [^\]\\\n]        #     something that's not a ], \, or newline
    )*
  ]                    #    and ending with a ]
)+
/                      # And a closing slash
(
  [gim]+\b             # Followed by one or more of g, i, m
  |
  \B                   # or something that isn't a word boundary
)

你能解释一下
[^[/\\\n]
在做什么吗?它看起来像是在匹配任何不是左括号、正斜杠、反斜杠或换行符的字符。我不确定不转义左括号是否有效,但我想它并不是真的模棱两可。@Vinet为每个部分添加了解释。
[^[/\\\n]
-为什么第二个
[
没有进入下一行?为什么这不会影响
]
?对不起,有这么多问题…因为一旦你进入字符类(在
[]
中),另一个
[
被视为字符类中包含的字符之一—有点像
-
如果位于字符类的末尾,则不需要转义。因此,例如,
[^[]
是“任何非
[
的字符”,如果将其移植到Java的
模式。编译(“…”)
然后您必须将每个
\
加倍为Java中的字符串,将
\
视为以下字符的转义,您需要使用
compile()
方法来准确查看此处显示的内容。@AdrianPronk-是的,我已经这样做了。有关此问题的详细信息,请参阅此处: