不同格式的Java正则表达式数字提取

不同格式的Java正则表达式数字提取,java,regex,Java,Regex,我有一个字符串,可以用以下几种格式之一显示数字: Name ProductA Price R 3 250 或 我不知道价格将以哪种格式显示,所以我想同时查找这两种格式。 我知道第一个字符串的正则表达式是: \\bPrice\\sR\\s\\b*(\\d\\s\\d+) \\bPrice\\sR\\s\\b*(\\d+) 第二种情况是: \\bPrice\\sR\\s\\b*(\\d\\s\\d+) \\bPrice\\sR\\s\\b*(\\d+) 但是,如果同时检查并捕获价格编号,R

我有一个字符串,可以用以下几种格式之一显示数字:

Name ProductA Price R 3 250

我不知道价格将以哪种格式显示,所以我想同时查找这两种格式。 我知道第一个字符串的正则表达式是:

\\bPrice\\sR\\s\\b*(\\d\\s\\d+)
\\bPrice\\sR\\s\\b*(\\d+)
第二种情况是:

\\bPrice\\sR\\s\\b*(\\d\\s\\d+)
\\bPrice\\sR\\s\\b*(\\d+)

但是,如果同时检查并捕获价格编号,Regex会是什么样子呢?

您可以为以下数字设置一个可选组(捕获组1中的价格):

字符串文字:
\\b价格\\sR\\s(\\d+(?:\\s\\d+))

细分:

  • \b价格\sR\s
    匹配文字字符串
    价格R
  • 开始捕获第一组
    • \d+
      匹配一个数字序列
    • (?:\s\d+)
      匹配空格前面的一组数字,如果存在,则为非捕获组
  • 捕获组结束
或者使用正向查找将价格包含在组中
0

(?<=\bPrice\sR\s)\d+(?:\s\d+)?

(?您可以为以下数字选择一个组(第一组中的价格):

字符串文字:
\\b价格\\sR\\s(\\d+(?:\\s\\d+))

细分:

  • \b价格\sR\s
    匹配文字字符串
    价格R
  • 开始捕获第一组
    • \d+
      匹配一个数字序列
    • (?:\s\d+)
      匹配空格前面的一组数字,如果存在,则为非捕获组
  • 捕获组结束
或者使用正向查找将价格包含在组中
0

(?<=\bPrice\sR\s)\d+(?:\s\d+)?

(?使
\\s\\d
部件可选,如下所示:

\\bPrice\\sR(?:\\s(\\d))?\\s(\\d+)
--          ^^^^^^^^^^^^^
请注意,可选部件组是非捕获的,允许您通过捕获组1和2检索价格的相关部分


使
\\s\\d
部件成为可选部件,如下所示:

\\bPrice\\sR(?:\\s(\\d))?\\s(\\d+)
--          ^^^^^^^^^^^^^
请注意,可选部件组是非捕获的,允许您通过捕获组1和2检索价格的相关部分


您可能需要
\\b价格\\sR\\s(\\d+(?:\\s\\d+)
。请看现场演示,您可以将数字部分更改为
((?:\d\s)*\d+)
谢谢@Matt.G,行得通!请您解释一下(?:\d\s)部分,我看到上面写着“分组正则表达式而不记住匹配的文本”,但我不确定这是什么意思!您可能需要
\\b价格\\sR\\s(\\d+(?:\\s\\d+)
。请看现场演示,您可以将数字部分更改为
((?:\d\s)*\d+)
谢谢@Matt.G,这很有效!您介意解释一下(?:\d\s)部分吗?我看到它说的是“分组正则表达式而不记住匹配的文本”,但我不确定这意味着什么!这将创建两个捕获组,我担心OP是否需要两个。谢谢,我也是这样做的:?将部分设置为可选的?另外,我希望它捕获(一个组)。然后我是否只使用:(?:\\d\\s)*\\d+)@CornelVerster
(?:…)
是一个非捕获组。如果您想捕获整个内容,请使用以下表达式:
\\b价格\\sR\\s((?:\\d\\s)?\\d+
这将构成两个捕获组,我担心OP是否需要两个。谢谢,我也是这样做的:?将一部分设置为可选的?另外,我希望它捕获(一个组)。然后我将只使用:(?:\\d\\s)*\\d+)?@CornelVerster
(?:…)
是一个非捕获组。如果要捕获整个价格,请使用以下表达式:
\\b价格\\sR\\s((?:\\d\\s)?\\d+
这是否仍在一组中捕获整个价格?还是两个?你的第一个例子是,它在一个组中捕获整个价格。你想让他们分开分组吗?请查看细分。这是否仍然包含一组中的全部价格?还是两个?你的第一个例子是,它在一个组中捕获整个价格。你想让他们分开分组吗?请看明细表。