提取在特定模式之后出现的子字符串

时间:2015-04-03 12:25:48

标签: java regex

我需要提取输入字符串中某个模式之后出现的子字符串。我一直在尝试各种组合,但没有得到预期的输出。 输入字符串可以是以下两种形式

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'

谢谢。

3 个答案:

答案 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");