0

N lines次のように、 で構成される複数行の文字列を考えてみましょう。

Line 1 text
Line 2 text
Line 3 text
...
Line n-1 text
Line n text
anchor=value
Line n+2 text
Line n+3 text
Line n+4 text
...
Line N text

キーはanchorどの行にも表示されず、アンカーの前と=それに続く記号の周りにスペースがある場合があります。

上記の文字列を 3 つのグループに分割する正規表現が必要です。

  1. ライン 1 からライン n (包括的)
  2. アンカーライン(仕切りポイント)
  3. n+2 行目から N 行目まで (包括的)

私が解決策に最も近いのは

(?s)^(?:(?!anchor\s*=\s*).)+?\r|\nanchor\s*=\s*([^\r\n]+)(?:\r|\n)(.*)

ただし、上記の正規表現では、最初に一致したグループにテキスト全体が含まれ、残りの 2 つのグループが期待どおりに入力されます。

追加の要件は、正規表現が大量のデータに適用されるため、可能な限り高速である必要があることです。この使用例では、単一の正規表現による処理が唯一のオプションであることにも注意してください。

何か案は?

4

3 に答える 3

1

巨大な文字列の速度が必要で、正規表現は適していません。正規表現を使用してトークン化できるようにするには、文字列全体をメモリに保持する必要があります。代わりに Reader / InputStreams を使用することをお勧めします。

于 2015-03-02T22:18:02.687 に答える
1

さて、最初にアンカーを取得してから、それを分割できます。

String anchor = str.replaceAll("(?ms).*?(anchor\\s*=.*?)$.*", "$1");
String lineParts = str.split("\\Q" + anchor + "\\E");

"m" フラグは、^ と $ を行頭/行末に一致させます。

于 2015-03-02T22:18:33.263 に答える