不同格式的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+
这是否仍在一组中捕获整个价格?还是两个?你的第一个例子是,它在一个组中捕获整个价格。你想让他们分开分组吗?请查看细分。这是否仍然包含一组中的全部价格?还是两个?你的第一个例子是,它在一个组中捕获整个价格。你想让他们分开分组吗?请看明细表。