当前位置: 首页 > 面试题库 >

使用正则表达式从文本中删除连续重复的单词并显示新文本

彭硕
2023-03-14
问题内容

Hy

我有以下代码:

import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.regex.*;

/
public  class RegexSimple4
{

     public static void main(String[] args) {

          try {
              Scanner myfis = new Scanner(new File("D:\\myfis32.txt"));
              ArrayList <String> foundaz = new ArrayList<String>();
              ArrayList <String> noduplicates = new ArrayList<String>();

              while(myfis.hasNext()) {
                  String line = myfis.nextLine();
                  String delim = " ";
                  String [] words = line.split(delim);

                  for (String s : words) {                    
                      if (!s.isEmpty() && s != null) {
                          Pattern pi = Pattern.compile("[aA-zZ]*");
                          Matcher ma = pi.matcher(s);

                          if (ma.find()) {
                              foundaz.add(s);
                          }
                      }
                  }
              }

              if(foundaz.isEmpty()) {
                  System.out.println("No words have been found");
              }

              if(!foundaz.isEmpty()) {
                  int n = foundaz.size();
                  String plus = foundaz.get(0);
                  noduplicates.add(plus);
                  for(int i=1; i<n; i++) {   
                      if ( !noduplicates.get(i-1) .equalsIgnoreCase(foundaz.get(i))) {
                          noduplicates.add(foundaz.get(i));
                      }
                  }

                  //System.out.print("Cuvantul/cuvintele \n"+i);

              }
              if(!foundaz.isEmpty()) { 
                  System.out.print("Original text \n");
                  for(String s: foundaz) {
                      System.out.println(s);
                  }
              }
              if(!noduplicates.isEmpty()) {
                  System.out.print("Remove duplicates\n");
                  for(String s: noduplicates) {
                      System.out.println(s);
                  }
              }

          } catch(Exception ex) {
              System.out.println(ex); 
          }
      }
  }

目的是从短语中删除连续的重复项。该代码仅适用于一列字符串,不适用于全长短语。

例如,我的输入应为:

布拉布拉狗猫老鼠。猫老鼠狗狗。

和输出

布拉狗猫老鼠。猫老鼠狗。

真诚的


问题答案:

首先,正则表达式[aA-zZ]*不会执行您认为的操作。这意味着“匹配零个或多个aS或字符ASCII之间的范围内A和ASCII
z(其还包括[]\及其它),或ZS”。因此,它也匹配空字符串。

假设您只在寻找不重复的单词,该单词仅由ASCII字母组成,不区分大小写,保留第一个单词(这意味着您不希望匹配"it's it's""olé olé!"),那么您可以在单个regex操作中做到这一点:

String result = subject.replaceAll("(?i)\\b([a-z]+)\\b(?:\\s+\\1\\b)+", "$1");

将会改变

Hello hello Hello there there past pastures

进入

Hello there past pastures

说明:

(?i)     # Mode: case-insensitive
\b       # Match the start of a word
([a-z]+) # Match one ASCII "word", capture it in group 1
\b       # Match the end of a word
(?:      # Start of non-capturing group:
 \s+     # Match at least one whitespace character
 \1      # Match the same word as captured before (case-insensitively)
 \b      # and make sure it ends there.
)+       # Repeat that as often as possible

看到它住在regex101.com。



 类似资料:
  • 通常,当我想在python中使用正则表达式删除两个字符串之间的文本时,我会这样做: 其中 是我的文本,我使用上面的代码删除 z1 和 AA 之间的所有内容(包括 和 )。但是现在我正在努力为以下方面做同样的事情: 我有下面的字符串(来自乳胶。txt文件): 我的目标是替换所有的东西,从到最后一行的最后一个。我尝试了几个正则表达式组合,如和其他组合,但没有成功…我做错了什么?

  • 我有一个文本字符串,我想用另一个使用regexp的文本替换它 指用特定单词替换的每个单词 我的预期产出 用出版物标题替换期刊 分页替换页面 年份改为出版日期 DOI替换为数字对象标识符 罗氏链环替换为罗氏链环 我的正则表达式=\b(期刊|年份|页面| DOI |罗氏链接)\b 我的regexp检测所有特定的单词,但我没有找到使用将每个单词替换为特定单词的解决方案

  • 我试图在java中找到一个正则表达式,它可以提取句子中的连续词对,如下面的示例所示。 输入:word1 word2 word3 word4。。。。 输出: 文字1文字2 等... 知道怎么做吗?

  • 问题内容: 假设我想使用正则表达式删除字符串中的所有重复字符(特定字符)。这很简单- 如果我想用相应的字符替换所有重复的字符(即a,z)怎么办?我该怎么做呢? 注意: 我知道可以使用哈希表或某些O(n ^ 2)算法更好地解决这种删除重复项的方法,但是我想使用正则表达式进行探索 问题答案: 的周围的指定 捕获组 ,然后将(一个 反向引用 在图案和替换两者)指的是第一个捕获组的内容。 因此,正则表达式

  • 问题内容: 我正在编写一个程序来自动编写一些C代码,(我正在编写将字符串解析为同名枚举)C对字符串的处理不是很好。所以有些人一直在me我尝试python。 我做了应该删除C风格的功能,并 从字符串:下面是代码: 所以我尝试了这段代码。 它显然什么也没做。 关于我做错了什么建议? 有句话我已经听过几次了: 如果您有问题,并尝试使用Regex解决它,则会遇到两个问题。 编辑:回顾这几年后。(经过更多的

  • 在使用< code>bookdown的长段落中,我插入了许多图像。将段落组合成单个字符串(在数据框中)后,我想删除与插入图像相关的降价文本,但不删除这些插入图像之间的任何文本。这里有一个玩具的例子。 正则表达式不会在第一个闭括号处停止,它会一直持续到最后一个,并删除其间的“write to keep”。 我尝试在R中应用字符串操作:在多个位置删除特定模式,而不删除模式实例之间的文本,该模式使用和,