正则表达式匹配模式:从xxxx到yyyy的东西

时间:2012-04-23 01:40:34

标签: regex pattern-matching

我正在为基于位置的服务进行一些文本处理,我想知道输入是否与类型something sth FROM xxxx TO yyyy匹配。基本上我需要找出用户输入的源和目的地。

例如

show me how can I go from xxxx to yyyy
I want to go to abcd
I want to go from abcd to xyz

我在正则表达式方面不强,我可以出现的正则表达式A-Za-zA-Za-zA-Za-z无法正常工作。任何人都可以告诉我如何匹配多关键字正则表达式,其中单词可以由任意数量的单词分隔。例如I want to go FROM manhattan TO SeattleI want to go FROM times square, New York City TO Seattle。我可以通过索引来提取源/目的地。

我能够提取句子中间是否包含FROM,但我想让它成为通用的,所以我不必创建多个规则。用户可以说

I want to go TO x FROM y
I want to go FROM x to Y

在上面的句子中,源和目的地被交换。

由于

3 个答案:

答案 0 :(得分:2)

你需要使用单词边界锚点,否则正则表达式会在

这样的句子上失败
I want to go from Montreal to Toronto.

此外,你应该捕捉匹配词之间的部分,而不是匹配词本身:

Pattern regex1 = Pattern.compile(
    "\\b     # Match word boundary\n" +
    "from    # Match 'from'\n" +
    "\\s+    # Match whitespace\n" +
    "(.+?)   # Match one or more characters\n" +
    "\\b     # Match word boundary\n" +
    "to      # Match 'to'\n" +
    "\\s+    # Match whitespace\n" +
    "(.+)    # Match one or more characters", 
    Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE | Pattern.COMMENTS);
Pattern regex2 = Pattern.compile("\\bto\\s+(.+?)\\bfrom\\s+(.+)", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE | Pattern.COMMENTS);

Matcher regexMatcher = regex1.matcher(subjectString);
if (regexMatcher.find()) {
    fromString = regexMatcher.group(1);
    destString = regexMatcher.group(2);
} else {
    Matcher regexMatcher = regex2.matcher(subjectString);
    if (regexMatcher.find()) {
        fromString = regexMatcher.group(1);
        destString = regexMatcher.group(2);
    }   
}

答案 1 :(得分:0)

我能想到的最简单的是.*(from).*(to).*

答案 2 :(得分:0)

(?<=from\s)(.*)(?<=\sto)(.*)应该有用。