3
input1="caused/VBN by/IN thyroid disorder"

"caused"要件:スラッシュの後に任意の数の大文字のアルファベットが続き、スペース + が続かない単語を見つけます"by/IN

上記の例では、 の"caused/VBN"後に が続く" by/IN"ため、「caused」は一致しません。

input2="caused/VBN thyroid disorder" 

"by/IN"原因に従わないので、一致するはずです

regex="caused/[A-Z]+(?![\\s]+by/IN)"

caused/[A-Z]+-- 'caused' という単語 + / + 1 つ以上の大文字
(?![\\s]+by)-- 否定先読み - スペースと by が一致しない

以下は、私がテストに使用した簡単な方法です

public static void main(String[] args){
    String input = "caused/VBN by/IN thyroid disorder";

    String regex = "caused/[A-Z]+(?![\\s]+by/IN)";

    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(input);

    while(matcher.find()){
        System.out.println(matcher.group());
    }

出力:caused/VB

負の先読み正規表現が機能しない理由がわかりません。

4

2 に答える 2

7

正規表現に単語境界を含める必要があります。

String regex = "caused/[A-Z]+\\b(?![\\s]+by/IN)";

それがなければ、一致を得ることができますが、期待していたものではありません:

「原因/VBN by/IN 甲状腺障害」;
 ^^^^^^^^^^
 「N by」は「[\\s]+by」と一致しないため、これは一致します
于 2011-03-23T22:54:41.323 に答える
3

先読みが一致するように、文字クラス []+ 一致が (バックトラッキングによって) 調整されます。

あなたがしなければならないことは、式 []+ が完全に一致するようにバックトラッキングを停止することです.
これは、いくつかの異なる方法で行うことができます。

  1. 前向きな先見、その後の消費
    "caused(?=(/[A-Z]+))\\1(?!\\s+by/IN)"

  2. スタンドアロンの部分式
    "caused(?>/[A-Z]+)(?!\\s+by/IN)"

  3. 所有量指定子
    "caused/[A-Z]++(?!\\s+by/IN)"

于 2011-03-24T04:30:07.793 に答える