我正在尝试为英国式的体重输入做一个智能输入字段,例如“6石和3磅”或“6 st 11磅”,分组捕获2个数字。
现在我得到了:([0-9]{1,2}).*?([0-9]{1,2}).*
问题是它与2组中的“12石头”匹配,1和2而不是12只。是否可以制作在两种情况下都能正确捕获的正则表达式?
答案 0 :(得分:2)
你需要使第一部分具有占有欲,因此它永远不会被追溯到。
([0-9]{1,2}+).*?([0-9]{1,2})
答案 1 :(得分:2)
因为。匹配包括数字在内的所有内容..试试这个:
/(\d{1,2})\D+(\d{1,2})?/
答案 2 :(得分:1)
这样的东西?
\b(\d+)\b.*?\b(\d+)\b
第1组和第2组将包含您的数字。
说明:
"
\b # Assert position at a word boundary
( # Match the regular expression below and capture its match into backreference number 1
\d # Match a single digit 0..9
+ # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)
\b # Assert position at a word boundary
. # Match any single character that is not a line break character
*? # Between zero and unlimited times, as few times as possible, expanding as needed (lazy)
\b # Assert position at a word boundary
( # Match the regular expression below and capture its match into backreference number 2
\d # Match a single digit 0..9
+ # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)
\b # Assert position at a word boundary
"
答案 3 :(得分:0)
这样可行,然后查看捕获组1和3: ([0-9] {1,2})^ 0-9] +(([0-9] {1,2})?+)?
这个想法是制作一个数字和文本的命令,但是制作第二个数字和文本可选。
答案 4 :(得分:0)
以下是我对正则表达式的建议,以匹配您显示的两种变体:
(?<stone>\d+\s(?:stone|st))(?:\s(and)?\s?)(?<pound>\d+\s(?:pound|lb))
答案 5 :(得分:0)
目前有点模糊,这有效:
/([0-9]{1,2})(?:[^0-9]+([0-9]{1,2}).*)?/
获取此数据:
6石和3磅
6 st 11磅
12石
12 st和11lbs
答案 6 :(得分:0)
看到每个人都有所作为,这是我的:
(\d+)(?:\D+(\d+)?)
到目前为止,这绝对是最简洁的。这将匹配一个或两组数字:
"12": ("12", null)
"12st": ("12", null)
"12 st": ("12", null)
"12st 34 lb": ("12", "34")
"cabbage 12st 34 lb": ("12", "34")
"12 potato 34 moo": ("12", "34")
下一步是让它抓住所用单位的名称。
编辑:如上所述,我们不知道您使用的语言,并非所有实现中都提供所有正则表达式功能。但据我所知,\ d表示数字,\ D表示非数字是相当普遍的。