4

初めて正規表現を使用する必要があり、必要なことはほぼ達成できましたが、1つのステートメントにまとめることができないようです。

\nドットが前に付いていない場合、またはドットスペースが前に付いていない場合に置き換えたい単語の文字列があります。

これらの2つのステートメントのいずれかを実行して、必要な結果を得ることができます。ただし、それらを次々に実行するか、単一の正規表現に結合しようとすると、機能しません。

//replaces \n if not preceded by dot space
xx = xx.replaceAll("(.+)(?<!\\. )\n", "$1 ");


//replaces \n if not preceded by dot
xx = xx.replaceAll("(.+)(?<!\\.)\n", "$1 "); 


//one of my attempts to combine into a single statement
xx = xx.replaceAll("(.+)(?<!\\. )\n|(?<!\\.)\n", "$1 ");

文字列の例私が修正しようとしています。

これは\n可能性のあるテキストです
改行する改行文字があります\n
ただし、フルが前に付いていない場合にのみ削除したい。\ n
または、ピリオドとスペースが前に付いていません。\ n

これはいくつかのテキストです
改行する改行文字があります
ただし、フルが前に付いていない場合にのみ削除したい。\ n
または、ピリオドとスペースが前に付いていません。\ n

私は近くにいると思いますが、正規表現に慣れていないので、読むほど混乱します。

4

1 に答える 1

3

思ったより簡単です:

String resultString = subjectString.replaceAll("(?<!\\. ?)\n", " ");

説明:

(?<!   # Assert that the previous characters are not...
 \.    # a dot
 [ ]?  # optionally followed by a space
)      # End of lookbehind
\n     # Match a newline character

したがって、最初に一致させる必要はなく(.+)、後でそれ自体と置き換えるだけです。ちなみに、これがあなたをつまずかせたものです:

(.+)(?<!\. )\n|(?<!\.)\n

論理的に次のようにグループ化されます

(.+)(?<!\. )\n   # Match this
|                # or
(?<!\.)\n        # this

したがって、(.+)ドットの後にスペースがない場合にのみ一致します。

于 2013-01-14T12:21:34.007 に答える