web-dev-qa-db-ja.com

式の後の最初の単語を正規表現で一致させる方法は?

たとえば、このテキストでは:

Lorem ipsum dolorはamet、consectetur adipiscingエリートに座ります。 Nunc eu tellus vel nunc pretium lacinia。 Proin sed lorem。 Cras sed ipsum。リベロquis risus sollicitudin imperdietを無効にします。

「イプサム」の後の単語に一致させたい。

21
Matthew Taylor

これは後読みの仕事のように聞こえますが、すべての正規表現フレーバーがそれらをサポートしているわけではないことに注意してください。あなたの例では:

(?<=\bipsum\s)(\w+)

これは、単語全体としてスペースが続く「ipsum」に続く文字文字のシーケンスと一致します。 notは「ipsum」自体と一致します。たとえば、次のような場合に再挿入することを心配する必要はありません。交換。

ただし、前述のように、一部のフレーバー(JavaScriptなど)は後読みをまったくサポートしていません。他の多く(実際にはほとんど)は「固定幅」後読みのみをサポートしているため、この例は使用できますが、繰り返し演算子は使用できません。 (言い換えると、 (?<=\b\w+\s+)(\w+)は機能しません。)

36
Ben Blank

他のレスポンダーの一部は、後読みに依存しない正規表現を使用することを提案していますが、全体を理解するには、完全で実用的な例が必要だと思います。アイデアは、通常の方法でシーケンス全体( "ipsum"と次のWord)を照合し、次にキャプチャグループを使用して興味のある部分を分離することです。例えば:

String s = "Lorem ipsum dolor sit amet, consectetur " +
    "adipiscing elit. Nunc eu tellus vel nunc pretium " +
    "lacinia. Proin sed lorem. Cras sed ipsum. Nunc " +
    "a libero quis risus sollicitudin imperdiet.";

Pattern p = Pattern.compile("ipsum\\W+(\\w+)");
Matcher m = p.matcher(s);
while (m.find())
{
  System.out.println(m.group(1));
}

これは「dolor」と「Nunc」の両方を印刷することに注意してください。後読みバージョンでこれを行うには、次のようなハックをする必要があります。

Pattern p = Pattern.compile("(?<=ipsum\\W{1,2})(\\w+)");

これはJavaでのことで、後読みには明らかな最大長が必要です。一部のフレーバーは、それほど多くの柔軟性さえありません。もちろん、一部のフレーバーは後読みをまったくサポートしていません。

しかし、人々が彼らの例で抱えているように見える最大の問題は、後読みではなく、Wordの境界にあります。 David Kempとckはどちらも\bが「m」に続くスペース文字と一致することを期待しているようですが、一致しません。位置(または境界) 'm'とスペースに一致します。

これはよくある間違いで、いくつかの本やチュートリアルで繰り返し見たものですが、Wordの境界構造\bはどの文字とも一致しません。これは、ルックアラウンドやアンカー(^$\zなど)のようなゼロ幅のアサーションであり、一致するのは、Word文字と後に1つ、またはWord文字が続き、前に1つは付きません。

4
Alan Moore

ipsum\b(\ w *)

1
kͩeͣmͮpͥ ͩ

javascriptを使用すると、(?=ipsum.*?(\w+))

これも2番目のオカレンスを取得します(Nunc)

0
JLCDev