我需要提取输入字符串中某个模式之后出现的子字符串。我一直在尝试各种组合,但没有得到预期的输出。 输入字符串可以是以下两种形式
1. 88,TRN:2014091900217161 SNDR REF:149IF1007JMO2507 BISCAYNE BLVD STE
2. 88,TRN:2014091900217161 SNDR REF:149IF1007JMO2507
我需要编写一个适用于上述2种变体的正则表达式,然后提取“149IF1007JMO2507”。以下部分' SNDR REF:'。 请在下面找到我编写的示例程序。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTester {
private static final String input = "88,TRN:2014091900217161 SNDR REF:149IF1007JMO2507 BISCAYNE BLVD STE";
private static Pattern pattern = Pattern.compile(".*SNDR REF:(.*?)(\\s.)*");
private static Matcher matcher = pattern.matcher(input);
public static void main (String[] args) {
if (matcher.matches()) {
System.out.println(matcher.group(1));
}
}
}
Output:149IF1007JMO2507 BISCAYNE BLVD STE
我希望输出为' 149IF1007JMO2507'
谢谢。
答案 0 :(得分:1)
您可以使用以下习语来查找子字符串:
String[] examples = {
"88,TRN:2014091900217161 SNDR REF:149IF1007JMO2507 BISCAYNE BLVD STE",
"88,TRN:2014091900217161 SNDR REF:149IF1007JMO2507"
};
// ┌ look-behind for "SNDR REF:"
// | ┌ anything, reluctantly quantified
// | | ┌ lookahead for
// | | | whitespace or end of input
Pattern p = Pattern.compile("(?<=SNDR\\sREF:).+?(?=\\s|$)");
// iterating examples
for (String s: examples) {
Matcher m = p.matcher(s);
// iterating single matches (one per example here)
while (m.find()) {
System.out.printf("Found: %s%n", m.group());
}
}
<强>输出强>
Found: 149IF1007JMO2507
Found: 149IF1007JMO2507
注意强>
我希望您事先不知道它会成为"149IF1007JMO2507"
,因此会进行上下文匹配。
答案 1 :(得分:1)
您可以使用此正则表达式:
private static Pattern pattern = Pattern.compile(".*SNDR REF:([^\\s]+).*");
这将采取“SNDR REF
之后的所有内容答案 2 :(得分:1)
您可以使用replaceAll
执行此操作 str = str.replaceAll(".*(REF:(\\S+)).*", "$2");