4

第一次必须使用正则表达式,虽然我几乎达到了我的要求,但我似乎无法组合成一个语句。

\n如果前面没有点或前面没有点空格,我希望替换一串单词。

我可以运行这两个语句中的任何一个来实现所需的结果。但是,如果我一个接一个地运行它们或尝试将它们组合成一个正则表达式,它就不起作用。

//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 回答