【问题标题】:Java replace new line with space in String after abbreviationsJava在缩写后用空格替换新行
【发布时间】:2018-11-06 06:27:31
【问题描述】:

每当我在句子中找到缩写词(如 Mr.、prf. 等)时,我想删除每个包含缩写词的句子末尾的 '\n' 字符。欢迎任何想法。INPUT OUTPUT

到目前为止我的想法是:

List<String> pres = Arrays.asList("dl","Dl", "Prf", "Ing");
for(int i=1;i<4;i++){
    if (z.contains(pres.get(i)))
        f=z.indexOf(pres.get(i));
    z.replaceFirst("\\n"," ");//how i can use my f here to get rid of next new line...?
}

【问题讨论】:

  • 我假设z 是输入字符串之一。为了使问题完整,您可能需要分享您尝试处理的输入。
  • 是的,对不起,我的宝贝。输入和图片的输出一样

标签: java regex string


【解决方案1】:

这是一个近似的解决方案,不知道您要检查的完整缩写列表。您可以搜索以下模式,并替换为第一个捕获组:

((?:Mr|Mrs|Dr)\.[^.]+\.)\n

这将识别任何以点结尾的句子中的 last 缩写,紧接着是 \n 换行符。请注意,如果单个句子中有多个缩写词,则只会匹配最后一个缩写词。

String input = "Here is a sentence.  Said Mrs. Canopoy, here is another sentence about Mr. Potato Head.\r\nHere is a third sentence.";
System.out.println(input);
input = input.replaceAll("((?:Mr|Mrs|Dr)\\.[^.]+\\.)\\r\\n", "$1");
System.out.println(input);

Demo

我只检查Mr.Mrs.Dr.,但您可以添加任意数量的缩写词。

【讨论】:

  • 您需要根据您的使用情况修改模式。试试这个:input = input.replaceAll("(.*(?:Mr|Ing|dl|Dl|Prf)\\..*)\\n", "$1");
  • 话虽如此,还请看一下this discussion,了解为什么要避免使用String.replaceAll
  • @Timir 我看不出您的前瞻性,因为您仍在使用捕获组。而且我认为 OP 与其说关心这里的性能,不如说关心正确性。但你是对的;我们可以使用正式的模式匹配器来提高性能。
  • dosen`t work..返回与输入相同的内容。有没有可能代码找不到\n?
  • @BogdanRogojan 编辑您的问题并显示示例输入数据和预期输出。 “不起作用”不会让我帮助你。我无法为看不到的数据编写解决方案。
【解决方案2】:

就用这个吧:

String s = "Mike and Mr.\nDave take dinner.\nThat is very important.\nMe and Ing.\nMike bla bla..";
s = s.replaceAll("(Mr.|Ing.)\n", "$1 ");

【讨论】:

    猜你喜欢
    • 2013-08-11
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    相关资源
    最近更新 更多