如何解决正则表达式在被标点符号包围时不会返回单个字符
在开始之前,我先说我是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
任何帮助将不胜感激。
解决方法
尽管您的正则表达式有时可以工作,但这是错误的。让我先解释一下:
-
[^<]
表示不小于符号<
的任何字符。^
的含义相反,放在字符类中,即放在括号[]
之间。 -
.*
匹配任何字符零次或多次。 让我们看看您的正则表达式如何工作:
-
[^<].*[^>]
和<12>
:-
[^<]
无法匹配<
,因此它匹配1
-
.*
匹配2
-
[^>]
无法匹配>
,因此正则表达式引擎回溯到2
,现在.*
却什么也没有匹配。
-
-
[^<].*[^>]
和<1>
:-
[^<]
与<
不匹配,因此与1
匹配。 -
.*
与>
匹配。 -
[^>]
现在,正则表达式引擎回退了cuz以使其具有匹配项,它需要匹配非<
且已到达字符串末尾的任何字符。现在.*
不匹配任何内容,下一个字符为>
,这就是匹配失败的原因。
-
您打算做的是^<(.*?)>
,其中:
-
^
字符串的开头(如果要匹配字符串的任何部分,则可以忽略它) -
<
匹配一个小于号。 -
.*
匹配零个或多个出现的任何字符。如果您想更具体一些,可以使用,并且只匹配数字\d
或[0-9]
代替句点。 -
>
匹配大于号。
括号表示捕获这些字符,在正则表达式行话中称为捕获组。
要解决此问题的另一种方法是使用先行(?=)
和后退(?<=)
,它们是不可捕获的组,它们会断言以下字符(是否为前面的字符)验证给定的模式。
正则表达式将变为(?<=<).*(?=>)
,这意味着匹配<>
之间的任何字符
[^<]
(非“ .*不与之匹配的[^>]]
(非“>”的任何字符)与2。
如果要提取之间的数字,则正则表达式看起来像<(.*)>
,它与整个集合匹配,但是.*
周围的括号应报告为匹配的子组。根据您使用的语言,您将需要使用可用的库来提取子组匹配项。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。