0

入力が type と一致するかどうかを調べたいロケーションベースのサービスのテキスト処理に取り組んでいます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-z、機能A-Za-zA-Za-zていません。単語が任意の数の単語で区切られている複数のキーワードの正規表現を一致させる方法を教えてください。たとえば、I want to go FROM manhattan TO SeattleまたはI 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

上記の文では、ソースと宛先が入れ替わっています。

ありがとう

4

3 に答える 3

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);
    }   
}
于 2012-04-23T06:55:35.457 に答える
0

私が考えることができる最も簡単なものは.*(from).*(to).*

于 2012-04-23T01:46:57.393 に答える
0

(?<=from\s)(.*)(?<=\sto)(.*)動作するはずです。

于 2012-04-23T01:56:01.027 に答える