1

文字列をさかのぼってパターンを変更するにはどうすればよいですか?

「段落」という単語がパターン (アルファ) の後ろにある場合、一致は false であり、それ以外の場合は true です。

たとえば、これには5 つの一致があります。

(a)、(b)、(c)、(d)、または (e) 段落 (f) で言及されている人物に代わって行動する。

それらは次のようになります。(a) (b) (c) (d) (e)

そして、これには0の一致があります:

段落 (a)、(b)、(c)、(d)、または (e) で言及されている人物に代わって行動する。

4

3 に答える 3

2

単純な後読みでは、これはどのような長さでも不可能です。Java 正規表現フレーバーでは、有限長の後読みのみが許可されます (つまり、実行できますが、実行できませ(?<=x{2,10})(?<=x*))。

paragraph問題を「単語が の前の 100 文字に含まれてはならない」に減らすことができれば(a)、それは機能します。

(?<!paragraph.{0,100})\([a-z]\)

無制限の距離が本当に必要、正規表現が柔軟で、入力の先頭から開始して 1 つだけに一致(ref)する場合は、負の先読み (有限である必要はありません) で目的の動作を近似できます。

^(?!.*?paragraph.*?\([a-z]\)).*?\([a-z]\)

一致しますが、一致test test (a)しませんparagraph test (a)

これはトリックですが、維持するのが非常に複雑になる可能性があり、欠点があり (マッチングが 1 回しかないなど)、最終的にはおそらく問題を解決するためのより良い方法があります。たとえば、それらすべて([a-z])を照合してから、文字列に が含まれているかどうかを確認しparagraph、その位置の後にあるすべての一致を除外できます。

PS: の代わりにor (正規表現全体で大文字と小文字が区別されない場合) または(のみ大文字と小文字が区別されない場合) のPattern.compile("[aA][bB][cC]")使用を検討してください。Pattern.compile("abc", Pattern.CASE_INSENSISIVE)Pattern.compile("(?i)abc")Pattern.compile("(?i:abc)dEf")abc

于 2013-01-31T13:08:55.737 に答える
1

あなたはこのようにすることができます:

(私はケース集約的な部分を無視しました、あなたはあなた自身で追加することができます)

".*Paragraph.*\\(a\\)" 

これは、あなたのケースに一致するものがあるかどうかをチェックしていますFALSE。つまり、(a)paragraphに。

次に、その行が上記の正規表現と一致するかどうかを確認します。trueの場合はスキップし、falseの場合はスキップします。

grepでテスト:(-vは一致しない行を表示するためのものです)

kent$  cat test.txt
(a)
Paragraph (a)
(b) (c)
foo bar Paragraph (a) (b)
foo bar Paragraph (some) (a) (b)
foo bar (a) (b) Paragraph (c)

kent$  grep -v '.*Paragraph.*\(a\)' test.txt
(a)
(b) (c)
foo bar (a) (b) Paragraph (c)

少し問題があります。行にnoParagraphとnoがあれば、(a)同様に一致します。これは、Javaプログラムで次のように修正するのも簡単だと思います。

if (!m.find() && line.indexOf("(a)")>0) ...your match   
于 2013-01-31T13:15:04.050 に答える
0

次のように実行できます。

// If "paragraph" (case insensitive) does not appear before any (<alpha>)
// It means that "paragraph" (case insensitive) will appear after one (<alpha>)
// OR it does not appear at all in the string.
if (!str.matches("(?s)(?:(?!\\([a-z]+\\)).)*(?i:paragraph).*")) {
    // Use the Matcher loop to extract the text that matches pattern "\\([a-z]+\\)"
    Pattern p = Pattern.compile("\\([a-z]+\\)");
    Matcher m = p.matcher(str);

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

すべての. paragraph_ これは、文字列の長さに関係なく機能します。(<alpha>)(<alpha>)

于 2013-01-31T14:30:18.823 に答える