Pattern[] a =new Pattern[2];
a[0] = Pattern.compile("[$£€]?\\s*\\d*[\\.]?[pP]?\\d*\\d");
a[1] = Pattern.compile("Rs[.]?\\s*[\\d,]*[.]?\\d*\\d");
Ex:Rs.150
检测到a[1]
,150
检测到a[0]
。
如何删除此类交叉点并让它仅由a[1]
检测,而不是a[0]
检测到?
答案 0 :(得分:0)
使用初始测试在表达式之间切换。这个初始测试的速度和/或智能取决于你。
在这种情况下,您可以执行以下操作:
if (input.startsWith("Rs.") && a[1].matcher(input).matches()) {
return true;
}
并将其放在执行测试的方法前面。
简单地将最常见的正则表达式放在数组前面当然也有帮助。
答案 1 :(得分:0)
您可以在正则表达式中使用|
运算符。然后调用方法Matcher#group(int)以查看您的输入适用于哪种模式。如果匹配组为空,则此方法返回null
。
public static void main(String[] args) {
// Build regexp
final String MONEY_REGEX = "[$£€]?\\s*\\d*[\\.]?[pP]?\\d*\\d";
final String RS_REGEX = "Rs[.]?\\s*[\\d,]*[.]?\\d*\\d";
// Separate them with '|' operator and wrap them in two distinct matching groups
final String MONEY_OR_RS = String.format("(%s)|(%s)", MONEY_REGEX, RS_REGEX);
// Prepare some sample inputs
String[] inputs = new String[] { "$100", "Rs.150", "foo" };
Pattern p = Pattern.compile(MONEY_OR_RS);
// Test each inputs
Matcher m = null;
for (String input : inputs) {
if (m == null) {
m = p.matcher(input);
} else {
m.reset(input);
}
if (m.matches()) {
System.out.println(String.format("m.group(0) => %s\nm.group(1) => %s\n", m.group(1), m.group(2)));
} else {
System.out.println(input + " doesn't match regexp.");
}
}
}
m.group(0) => $100 m.group(1) => null m.group(0) => null m.group(1) => Rs.150 foo doesn't match regexp.
答案 2 :(得分:0)
使用否定展望来匹配a[1]
rs.150
格式,同时阻止a[0]
150
格式。
通用表达式:(?! the a[0] regex goes here ) followed by the a[1] expression
基本正则表达式语句:(?![$£€]?\s*\d*[\.]?[pP]?\d*\d)Rs[.]?\s*[\d,]*[.]?\d*\d
为java转义:(?![$£€]?\\s*\\d*[\\.]?[pP]?\\d*\\d)Rs[.]?\\s*[\\d,]*[.]?\\d*\\d