Java 忽略正则表达式以使用 BlueJ 删除重复行

Java is ignoring regex to remove duplicate lines using BlueJ

这里真绿。我正在尝试使用 BlueJ 将在 Notepad++ 中工作的正则表达式转换为 Java 中的 运行,但 Java 似乎忽略了它。我正在使用其他使用正则表达式的 replaceAll 函数,所有这些都在工作。

我有这个,但它告诉我 \s 是非法转义字符:

    itemList[i] = itemList[i].replaceAll("^(\s*\r\n){2,}", "\r\n");

我了解了 Java 引擎并将 \s 更改为 \s 所以它不是非法的:

    itemList[i] = itemList[i].replaceAll("^(\s*\r\n){2,}", "\r\n");

我尝试使用 [[:space:]] 代替,但是它仍然没有执行替换功能。

    itemList[i] = itemList[i].replaceAll("^([[:space:]]*\r\n){2,}", "\r\n");

此 Java 工具正在处理数百行,人们在使用 Notepad++ 删除重复行时遇到问题。我想也许在格式化工具中这样做可以消除这些问题。以下是文本示例:

1.  Modification: No Error Message When SQL Server Down 

              S9# 395 


              Summary 

              No error message when the SQL Server is 
              down. 

              Workaround 

              There is currently no 
              workaround for this issue. The system will become 
              unusable if SQL server is down.

需要使用多行模式,所以^可以匹配任意行的开头。否则它只匹配整个字符串的开头。多行模式是大多数文本编辑器的默认模式,但在其他任何地方使用正则表达式,您都必须指定它。只需将 (?m) 添加到正则表达式的开头:

(?m)^(\s*\r\n){2,}

如果你是 运行 Java 8,我建议你这样做:

replaceAll("(?m)^(?:\h*(\R)){2,}", "")

\s* 是有歧义的,因为它既可以匹配换行符也可以匹配空格; \h 仅匹配 水平 空格(例如,空格和制表符)。

\R 匹配任何类型的换行符:\r\n\n\r 或其他几种不太常见的换行符。内部组 (\R) 捕获最后一个多余的换行符,然后 "" 将其重新插入。这样,如果有人更改了文档的换行符格式,您就不会感到任何意外。