如何创建一个正则表达式,将匹配任何有2个维度,但不会匹配任何超过?



我正在使用一个Java程序,我正在尝试创建一个正则表达式,它将匹配任何具有二维的内容,而不匹配任何超过二维的内容。

我还尝试指示两个捕获组,以便我可以分别捕获每个维度值。维度必须以以下格式输入Some number x Other number(以x分隔)

下面是一些例子来更好地解释我在做什么:

  • S (26 in x 30 in):这应该匹配并捕获26和30。
  • 20 x 40:这应该匹配并捕获20和40。
  • Standard Size (10 x 40):这应该匹配并捕获10和40。
  • 20 x 40 x 80:这应该不匹配。
  • M (26 in x 30 in x 50 in):这应该不匹配。

我已经尝试过这个正则表达式,但它仍然认为3个维度是有效的:

([d.,]+).*?[xX] ?([d,.]+).*

我想这应该能得到你想要的:

^[^d]*(d+)[^dx]*[xX][^dx]*(d+)[^d]*$

可能会出现一个边缘情况,您的x不是两个数字之间的分隔符。不确定这是否是您用例的问题。

你可以看到它在这里工作regex101

试试这个:

^(?!.* x .* x ).*?(d+)(?: [a-z]+)? x (d+)

查看现场演示

由于锚定到开始^(?!.* x .* x )

的负前瞻性,导致超过2个维度无法匹配。

请注意,我在下面的评论中回答了OP要求的原始问题的一个变体。

我还假设在以下示例字符串中进行匹配:

Extra x here is OK 31.6 x more chars a-w, y-z here is OK 81.7 same here
^^^^                                  ^^^^
Numbers 78 and 81.1 before 22.5 x 31 is OK
^^^^   ^^

你可以使用表达式

^(?!.*(?:d+(?:.d+)?[^dx]*x[^dx]*){2}d).*(?<![d.])(d+(?:.d+)?)[^dx]*x[^dx]*(?<![d.])(d+(?:.d+)?)

演示regex引擎执行以下操作:

^                 # match beginning of the string
(?!               # begin negative lookahead
.*              # match 0+ chars
(?:             # begin non-capture group
d+(?:.d+)? # match 1+ digits optionally followed by a period and 1+ digits
[^dx]*       # match 0+ chars other than digits and 'x'
x             # match 'x'
[^dx]*       # match 0+ chars other than digits and 'x'
){2}            # end non-capture group and execute twice
d              # match a digit
)                 # end negative lookahead
.*                # match 0+ digits
(?<!              # begin negative lookbehind
[d.]           # match a digit or period
)                 # end negative lookbehind
(                 # begin capture group 1
d+(?:.d+)?   # match 1+ digits optionally followed by a period and 1+ digits
)                 # end capture group 1
[^dx]*           # match 0+ chars other than digits and 'x'
x                 # match 'x'
[^dx]*           # match 0+ chars other than digits and 'x'
(?<!              # begin negative lookbehind
[d.]           # match a digit or period
)                 # end negative lookbehind
(                 # begin capture group 2
d+(?:.d+)?   # match 1+ digits opinion followed by a period and 1+ digits
)                 # end capture group 2

请注意,表达式以一个负向前看开始,它断言没有

形式的子字符串。
ddd ... x ... ddd ... x ... ddd

通过首先满足这个要求,随后捕获两个感兴趣的子字符串变得更容易。

相关内容

  • 没有找到相关文章

最新更新