我正在使用一个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 )
请注意,我在下面的评论中回答了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
通过首先满足这个要求,随后捕获两个感兴趣的子字符串变得更容易。