1

方向を表す文があり、これらの方向に指定された距離 (数値のみ) を取得する必要があります。以下に例を示します。

"Head northwest on Lincoln St toward Warbuton Ave 0.1 mi" //0.1
"Head northwest on Middlefield Rd toward Embarcadero Rd 95 ft" //95
"Make a U-turn at Warbuton Ave 0.3 mi" //0.3
"Take the first right onto Embarcadero Rd 12.43 mi" //12.43

可能な単位指定子は「ft」と「mi」です。数値自体は一般に 10 進数です。これらの数字を選択するための正規表現は何でしょうか? 文字列には他の数値が含まれる場合がありますが、通常は の形式ではありませんxy.zw mi

できれば同じ式で\d*\.\d* miチェックできるようにしたいのですが。ftまた、非10進数ではこれが機能しないことを認識しています... 10進数と末尾の数字をオプションにする必要があると思います。

4

4 に答える 4

2

使用するパターンは次のとおりです。

\d++(?:\.\d++)?(?=\s*+(?:mi|ft))

それを見てみましょう:

  • \d++regex digits group は 1 回以上、場合によっては一致します
  • (?:\.\d++)?オプションの非キャプチャ グループで上記が続くドット (したがって、10 は 10.11 と同様に一致します)
  • (?=\s*+(?:mi|ft))miまたはが続く任意の量の空白の先読みアサーションft

Java での例を次に示します。

public static void main(String[] args) throws ParseException {
    final String[] in = {"Head northwest on Lincoln St toward Warbuton Ave 0.1 mi",
        "Head northwest on Middlefield Rd toward Embarcadero Rd 95 ft",
        "Make a U-turn at Warbuton Ave 0.3 mi",
        "Take the first right onto Embarcadero Rd 12.43 mi"};
    final Pattern pattern = Pattern.compile("[0-9]++(?:\\.[0-9]++)?(?=\\s++(?:mi|ft))", Pattern.CASE_INSENSITIVE);
    for (final String s : in) {
        final Matcher m = pattern.matcher(s);
        while (m.find()) {
            System.out.println(m.group());
        }
    }
}

出力:

0.1
95
0.3
12.43

Java コードの二重エスケープに注意してください。フラグも追加しましたCASE_INSENSITIVE。これは、たとえば、ft Ft FTなどのすべての順列に一致することです。

于 2013-06-23T11:16:24.053 に答える
2

浮動小数点数の一致の例は、regular-expressions.infoにあります。

ftまたはmiと書かれてい(ft|mi)ます。

これらの正規表現の連結は、読者の課題として残されています。

于 2013-06-23T11:08:46.250 に答える