正则表达式捕获引号内和带/不带空格的数字

Posted

技术标签:

【中文标题】正则表达式捕获引号内和带/不带空格的数字【英文标题】:Regular Expression to Capture for Number within Quotes and with/out Space 【发布时间】:2021-10-04 23:23:03 【问题描述】:

我有一个正则表达式,它将捕获以 JKB 开头的任何字符串文字及其后面的数字。

我为它构建了以下 Reg Ex:

(?'Account'JKB[0-9]+LC),(?'Amount'[0-9,.]*)

它从以下列表中捕获除第一个和第二个之外的所有Amount

    29/7/2021,FDC 银行 PLC / Mr P.S.R STEVE SMITH,JKB99999LC,“9,500,000” 29/7/2021,FDC 银行 PLC / Mr P.S.R STEVE SMITH,JKB99999LC,"9,500,000" 29/7/2021,FDC Bank PLC / Mr P.S.R STEVE SMITH,JKB99999LC,9500000 29/7/2021,FDC Bank PLC / Mr P.S.R STEVE SMITH,JKB99999LC,9,500,000

我怎样才能让我的 RegEx 也适应捕获第 1 项和第 2 项;至少数量

这是我的工作:https://regex101.com/r/mcQtA9/2

【问题讨论】:

@SebastianSchumann 您的演示没有捕获所有Amount 组。但是,下面@wiktor-Stribiżew 的回答确实 哦 - 对不起。误读了问题。 【参考方案1】:

您需要确保使用两个组模式之间的子字符串。你可以使用

(?<Account>JKB[0-9]+LC),"?\s*(?<Amount>[0-9,.]*)
(?<Account>JKB[0-9]+LC),\W*(?<Amount>[0-9,.]*)

查看regex101 demo 和.NET regex demo:

我在第一个模式中使用"?\s* 来匹配可选的",然后匹配零个或多个空白字符。在第二个变体中,我只是使用 \W* 来匹配任何零个或多个非单词字符。

我更喜欢 (?&lt;name&gt;...) 命名捕获组语法,但如果您更习惯这种语法,您可以使用单引号变体。

【讨论】:

注意到您上面列出的第二个RegEx (?&lt;Account&gt;JKB[0-9]+LC),"W*(?&lt;Amount&gt;[0-9,.]*) 不正确;不应该是(?&lt;Account&gt;JKB[0-9]+LC),"?\W*(?&lt;Amount&gt;[0-9,.]*) 吗?这也涵盖了所有内容。 @hiFI 当我们有确切的规格时,我们只能谈论正则表达式的“正确性”。在这种情况下,,\W* 的工作方式与,"?\W* 相同,因为" 是一个非单词字符。

以上是关于正则表达式捕获引号内和带/不带空格的数字的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式用破折号、空格破折号、点空间、点和带有空字符串的撇号替换空格

正则表达式:匹配字母数字和空格,但前导空格除外

用于支持默认链接和带数字符号 (#) 的链接的正则表达式 [重复]

正则表达式选择所有不在引号中的空格?

用于解析 CSV 的正则表达式

正则表达式中的命名捕获组