Java 如何只匹配前面/后面没有字母字符的数字?

Java 如何只匹配前面/后面没有字母字符的数字?,java,regex,Java,Regex,我对正则表达式相当陌生。在Java中,我试图找到以下模式: (<numeric> (completes|completing)) OR ((completes|completing) <numeric>) 它将匹配以下模式: 2.29 completes completes 2.29 2.29 completing completing 2.29 但是,输入文本的数字旁边可能有一个alpha字符。在这些情况下,输出为: x3.25 completes 2.29 (ma

我对正则表达式相当陌生。在Java中,我试图找到以下模式:

(<numeric> (completes|completing)) OR ((completes|completing) <numeric>)
它将匹配以下模式:

2.29 completes
completes 2.29
2.29 completing
completing 2.29
但是,输入文本的数字旁边可能有一个alpha字符。在这些情况下,输出为:

x3.25 completes 2.29 (match: completes 2.29)
2.29 completes 3.25x (match: 2.29 completes)
x3.25 completing 2.29 (match: completing 2.29)
2.29 completing 3.25x (match: 2.29 completing)
下面是示例数据

n16 2.00/2.50  stg live completes 6.5
v/f -30 cso   completing  .006
m16 1.95p live completing 1
m16 1.95p live completing 1 again and out
n16 1.75/2.50 stg live completing 2.6
v16 2.75c x2.39 completing 9.9, 650x go
v16 2.75c x2.39 completing 9.9 again, 900 go
q 2.0 p vs 2.25/2.50 cs live .026 completing
q 2.00 p vs 2.25/2.50 c 2.21 completes 500x .026
v16 2.75c x2.39 completing 9.9 again and out, 1500x go
m16 1.90p live completing .25 and out
fh17 4.00/4.50cs x3.01 completing 4.9
z 2.00 p x2.89 completes .023 6 delta
fh17 4.00/4.50cs x3.01 completing 4.9 again, 500/month go
h17  4.00/6.00 cs x 2.99  completes 12.4 ,  18  delta
h17  4.00/6.00 cs x 2.99  completes 12.4 , 18 delta , 500x , 12.3/12.5 follow
z 2.00 p x2.89 completes .024
fh17 4.00/4.50cs x3.01 completing 5 now
f17-h17 2.50/3.00 ps x 3.01  completes 23.3 , 21 delta
h17 5.00 c x 2.99 completes 8.7
cal18 2.25/4.25 fen live completing 1.2, 200/month go and out
正则表达式如何满足这一要求?感谢您的帮助。

说明
(?=x\s*[0-9.]+\s+complett)。*?\K(?:complett(?:es | ing))\s*[0-9.]+| complett(?:es | ing)\s*[0-9.]+(?!\s*x |[0-9])[0-9.]+\s*complett(?:es | ing)

此正则表达式将执行以下操作:

  • 完成
    完成
    与前面或后面的数字匹配
  • 如果前面的数字前面有一个
    x
  • 如果后跟
    x
注意:将数字的断言从
[0-9]+(?:\[0-9])?
更改为
[0-9.]+
,这要求数字带有一个可选小数点,因为您的示例文本似乎已经过验证,格式更易于阅读

例子 现场演示

示例文本

n16 2.00/2.50  stg live completes 6.5
v/f -30 cso   completing  .006
m16 1.95p live completing 1
m16 1.95p live completing 1 again and out
n16 1.75/2.50 stg live completing 2.6
v16 2.75c x2.39 completing 9.9, 650x go
v16 2.75c x2.39 completing 9.9 again, 900 go
q 2.0 p vs 2.25/2.50 cs live .026 completing
q 2.00 p vs 2.25/2.50 c 2.21 completes 500x .026
v16 2.75c x2.39 completing 9.9 again and out, 1500x go
m16 1.90p live completing .25 and out
fh17 4.00/4.50cs x3.01 completing 4.9
z 2.00 p x2.89 completes .023 6 delta
fh17 4.00/4.50cs x3.01 completing 4.9 again, 500/month go
h17  4.00/6.00 cs x 2.99  completes 12.4 ,  18  delta
h17  4.00/6.00 cs x 2.99  completes 12.4 , 18 delta , 500x , 12.3/12.5 follow
z 2.00 p x2.89 completes .024
fh17 4.00/4.50cs x3.01 completing 5 now
f17-h17 2.50/3.00 ps x 3.01  completes 23.3 , 21 delta
h17 5.00 c x 2.99 completes 8.7
cal18 2.25/4.25 fen live completing 1.2, 200/month go and out
样本匹配

[0] => completes 6.5
[1] => completing  .006
[2] => completing 1
[3] => completing 1
[4] => completing 2.6
[5] => completing 9.9
[6] => completing 9.9
[7] => .026 completing
[8] => 2.21 completes
[9] => completing 9.9
[10] => completing .25
[11] => completing 4.9
[12] => completes .023
[13] => completing 4.9
[14] => completes 12.4
[15] => completes 12.4
[16] => completes .024
[17] => completing 5
[18] => completes 23.3
[19] => completes 8.7
[20] => completing 1.2
解释 描述
(?=x\s*[0-9.]+\s+complett)。*?\K(?:complett(?:es | ing))\s*[0-9.]+| complett(?:es | ing)\s*[0-9.]+(?!\s*x |[0-9])[0-9.]+\s*complett(?:es | ing)

此正则表达式将执行以下操作:

  • 完成
    完成
    与前面或后面的数字匹配
  • 如果前面的数字前面有一个
    x
  • 如果后跟
    x
注意:将数字的断言从
[0-9]+(?:\[0-9])?
更改为
[0-9.]+
,这要求数字带有一个可选小数点,因为您的示例文本似乎已经过验证,格式更易于阅读

例子 现场演示

示例文本

n16 2.00/2.50  stg live completes 6.5
v/f -30 cso   completing  .006
m16 1.95p live completing 1
m16 1.95p live completing 1 again and out
n16 1.75/2.50 stg live completing 2.6
v16 2.75c x2.39 completing 9.9, 650x go
v16 2.75c x2.39 completing 9.9 again, 900 go
q 2.0 p vs 2.25/2.50 cs live .026 completing
q 2.00 p vs 2.25/2.50 c 2.21 completes 500x .026
v16 2.75c x2.39 completing 9.9 again and out, 1500x go
m16 1.90p live completing .25 and out
fh17 4.00/4.50cs x3.01 completing 4.9
z 2.00 p x2.89 completes .023 6 delta
fh17 4.00/4.50cs x3.01 completing 4.9 again, 500/month go
h17  4.00/6.00 cs x 2.99  completes 12.4 ,  18  delta
h17  4.00/6.00 cs x 2.99  completes 12.4 , 18 delta , 500x , 12.3/12.5 follow
z 2.00 p x2.89 completes .024
fh17 4.00/4.50cs x3.01 completing 5 now
f17-h17 2.50/3.00 ps x 3.01  completes 23.3 , 21 delta
h17 5.00 c x 2.99 completes 8.7
cal18 2.25/4.25 fen live completing 1.2, 200/month go and out
样本匹配

[0] => completes 6.5
[1] => completing  .006
[2] => completing 1
[3] => completing 1
[4] => completing 2.6
[5] => completing 9.9
[6] => completing 9.9
[7] => .026 completing
[8] => 2.21 completes
[9] => completing 9.9
[10] => completing .25
[11] => completing 4.9
[12] => completes .023
[13] => completing 4.9
[14] => completes 12.4
[15] => completes 12.4
[16] => completes .024
[17] => completing 5
[18] => completes 23.3
[19] => completes 8.7
[20] => completing 1.2
解释
在每一面使用单词边界:
\b\d+(?:。\d+)\s*完成\s*\d+(?:。\d+)\b
您的信息不完整。唯一可以确定的是,它需要
完成
。即使它匹配一个数字(可选),该数字也需要一个小数。如果这需要验证,您应该使用锚定来指定开始和结束。@anubhava missing\in
3.25完成了2.29
您想匹配多少?@sln如果输入是
今天对冲x3.25完成了2.29价格
,然后我只想匹配
完成2.29
在每边使用单词边界:
\b\d+(?:。.d+)\s*完成\s*\d+(?:。.d+)\b
您的信息不完整。唯一可以确定的是,它需要
完成
。即使它匹配一个数字(可选),该数字也需要一个小数。如果这需要验证,您应该使用锚定来指定开始和结束。@anubhava missing\in
3.25完成了2.29
您想匹配多少?@sln如果输入是
今天对冲x3.25完成了2.29价格
,然后我只想匹配
完成2.29
哇,非常好的小提琴网站。我现在正在玩弄它。我刚刚更新了我的问题,更详细。我已经对我的答案进行了全面检查,以解决添加到您的问题中的其他示例文本。让我知道进展如何。是的,这就是答案。我只是在复习小提琴上的解释。哇,谢谢,这是一个非常好的提琴网站。我现在正在玩弄它。我刚刚更新了我的问题,更详细。我已经对我的答案进行了全面检查,以解决添加到您的问题中的其他示例文本。让我知道进展如何。是的,这就是答案。我只是在复习小提琴上的解释。哇,谢谢