正则表达式在被标点符号包围时不会返回单个字符

问题描述

在开始之前,我先说我是regex的新手,但是今天我已经进行了广泛的研究,无法找到以下问题的解决方案。

编辑:我只想返回所有示例中的数字。但是我希望排除标点符号

如果使用标点符号将单个字符串括起来,然后选择不返回标点符号,则不会返回该字符串。

这是此问题的基本示例。

[^<].*[^>] on <12> returns 12
[^<].*[^>] on <1> returns nothing

如果只在一侧标点,则不返回,这样就可以正常工作。

[^<].* on <1 returns 1
.*[^>] on 1> returns 1
[^<].*[^>] on <1> returns nothing

这是我尝试过的正则表达式及其结果。

[^<].*[^>] on <1> returns nothing
[^<][.]*[^>] on <1> returns nothing
[^<]+[^>] on <1> returns nothing
[^<][^\r\n]*[^>] on <1> returns nothing
[^<]\w*[^>] on <1> returns nothing
[^<]\d*[^>] on <1> returns nothing
[^<].?[^>] on <1> returns nothing
[^<][0-9]?[^>] on <1> returns nothing
[^<].*?[^>] on <1> returns nothing

任何帮助将不胜感激。

解决方法

尽管您的正则表达式有时可以工作,但这是错误的。让我先解释一下:

  • [^<]表示不小于符号<的任何字符。 ^的含义相反,放在字符类中,即放在括号[]之间。
  • .*匹配任何字符零次或多次。 让我们看看您的正则表达式如何工作:
  1. [^<].*[^>]<12>
    • [^<]无法匹配<,因此它匹配1
    • .*匹配2
    • [^>]无法匹配>,因此正则表达式引擎回溯到2,现在.*却什么也没有匹配。
  2. [^<].*[^>]<1>
    • [^<]<不匹配,因此与1匹配。
    • .*>匹配。
    • [^>]现在,正则表达式引擎回退了cuz以使其具有匹配项,它需要匹配非<且已到达字符串末尾的任何字符。现在.*不匹配任何内容,下一个字符为>,这就是匹配失败的原因。

您打算做的是^<(.*?)>,其中:

  • ^字符串的开头(如果要匹配字符串的任何部分,则可以忽略它)
  • <匹配一个小于号。
  • .*匹配零个或多个出现的任何字符。如果您想更具体一些,可以使用,并且只匹配数字\d[0-9]代替句点。
  • >匹配大于号。

括号表示捕获这些字符,在正则表达式行话中称为捕获组。

要解决此问题的另一种方法是使用先行(?=)和后退(?<=),它们是不可捕获的组,它们会断言以下字符(是否为前面的字符)验证给定的模式。

正则表达式将变为(?<=<).*(?=>),这意味着匹配<>之间的任何字符

,

[^<](非“ .*不与之匹配的[^>]](非“>”的任何字符)与2。

如果要提取之间的数字,则正则表达式看起来像<(.*)>,它与整个集合匹配,但是.*周围的括号应报告为匹配的子组。根据您使用的语言,您将需要使用可用的库来提取子组匹配项。