我在Java中使用正则表达式时遇到问题。以下内容应该匹配
2x 1 piece
63x 9 pieces
4x 1 piece
1 piece
23 pieces
这个正则表达式:
((\w+)x\s)*(\w+)\s*(\w*)
众所周知,我们必须在Java中转义字符串。我逃脱了正则表达式,我试图使用这个:
String regex = "((\\w+)x\\s)*(\\w+)\\s*(\\w*)";
现在出现了我的问题:正则表达式的所有在线服务都将我的模式标记为有效,但java的模式除外。他们没有标记可能是假的,所以我无法真正看到我的问题。这是我试图在Java中使用的代码:
String regex = "((\\w+)x\\s)*(\\w+)\\s*(\\w*)";
Pattern r = Pattern.compile(regex);
Matcher m = r.matcher(someClassWithMethods.text());
int multiplier=0;
int value= 0;
String supplement = "";
if (m.find( )) {
multiplier= Integer.parseInt(m.group(2));
value= Integer.parseInt(m.group(3));
supplement = m.group(4);
}
我调试了整个事情,看看发生了什么,所有变量都是预期的,但我仍然得到一个空组。这个正则表达式有什么问题?
修改
由于注释,我已经更改了一些内容,并且我使用额外的if子句捕获了我的NumberException。现在我仍然没有得到匹配的结果。那可能是什么? 这是我的新代码:
String regex = "(?:(\\w+)x\\s)?(\\d+\\s+)(pieces?)";
Pattern r = Pattern.compile(regex);
Matcher m = r.matcher(quantityCell.text());
int quantityMultiplier = 0;
int quantity = 0;
String supplement = "";
if (m.find( )) {
if(m.group(1) != null){
quantityMultiplier = Integer.parseInt(m.group(1));
}
quantity = Integer.parseInt(m.group(2));
supplement = m.group(3);
}
答案 0 :(得分:1)
你的正则表达很奇怪:
\w+
为什么匹配"字符"当你只对前两个实例中的数字感兴趣时?((\w+)x\s)
为什么这是一个捕获组?你不想要结果。((\w+)x\s)*
为什么会重复?你期待多个乘数吗?如果存在多个正则表达式,正则表达式将仅捕获最后一个乘数。让我们试试这个:
(?:(\d+)x\s)?(\d+)\s(\w*)
由于第一次捕获是可选的,如果不存在,它将是null
,因此您需要检查它。
public static void main(String[] args) {
test("2x 1 piece");
test("63x 9 pieces");
test("4x 1 piece");
test("1 piece");
test("23 pieces");
}
private static void test(String input) {
String regex = "(?:(\\d+)x\\s)?(\\d+)\\s(\\w*)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
if (m.find()) {
int multiplier = (m.group(1) != null ? Integer.parseInt(m.group(1)) : -1);
int value = Integer.parseInt(m.group(2));
String supplement = m.group(3);
System.out.printf("%d, %d, '%s'%n", multiplier, value, supplement);
}
}
输出
2, 1, 'piece'
63, 9, 'pieces'
4, 1, 'piece'
-1, 1, 'piece'
-1, 23, 'pieces'