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

Java 使用正则表达式从文本中删除连续重复的单词并显示新文本,java,regex,string,substitution,substring,Java,Regex,String,Substitution,Substring,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(

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); 
          }
      }
  }
import java.io.*;
导入java.util.ArrayList;
导入java.util.Scanner;
导入java.util.regex.*;
/
公共类RegexSimple4
{
公共静态void main(字符串[]args){
试一试{
Scanner myfis=新扫描仪(新文件(“D:\\myfis32.txt”);
ArrayList foundaz=新的ArrayList();
ArrayList NodeUpplicates=新的ArrayList();
while(myfis.hasNext()){
String line=myfis.nextLine();
字符串delim=“”;
String[]words=line.split(delim);
对于(字符串s:words){
如果(!s.isEmpty()&&s!=null){
Pattern pi=Pattern.compile(“[aazz]*”);
匹配器ma=π匹配器;
if(ma.find()){
foundaz.add(s);
}
}
}
}
if(foundaz.isEmpty()){
System.out.println(“未找到任何单词”);
}
如果(!foundaz.isEmpty()){
int n=foundaz.size();
String plus=foundaz.get(0);
noduplicates.add(plus);

对于(int i=1;i首先,regex
[aA zZ]*
不做您认为它做的事情。它意味着“匹配零个或多个
a
或ASCII
a
和ASCII
z
之间的字符(还包括
[/code>,
]
\
和其他字符),或
z
s”。因此,它也与空字符串匹配

假设您只查找仅由ASCII字母组成的重复单词,不区分大小写,保留第一个单词(这意味着您不想匹配
“it's is”
“oléolé!”
),那么您可以在单个正则表达式操作中完成:

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

Hello hello Hello there there past pastures 
进入

说明:

(?i)#模式:不区分大小写
\匹配单词的开头
([a-z]+)#匹配一个ASCII“单词”,在第1组中捕获它
\匹配单词的结尾
(?:#非捕获组的开始:
\s+#至少匹配一个空白字符
\1#匹配之前捕获的相同单词(不区分大小写)
\b#并确保它到此为止。
)+#尽可能多地重复

看到了。

下面是您的代码。我用行分割文本和Tim的正则表达式

import java.util.Scanner;
import java.io.*;
import java.util.regex.*;
import java.util.ArrayList;
/**
 *
 * @author Marius
 */
public class RegexSimple41 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       ArrayList <String> manyLines = new ArrayList<String>();
       ArrayList <String> noRepeat = new ArrayList<String>(); 
        try
        {
            Scanner myfis = new Scanner(new File("D:\\myfis41.txt"));

            while(myfis.hasNext())
            {
                String line = myfis.nextLine();
                String delim = System.getProperty("line.separator");
                String [] lines = line.split(delim);

                for(String s: lines)
                {
                    if(!s.isEmpty()&&s!=null)
                    {
                        manyLines.add(s);
                    }
                }
            }
            if(!manyLines.isEmpty())
                    { System.out.print("Original text\n");
                        for(String s: manyLines)
                        {
                            System.out.println(s);
                }
                        }
            if(!manyLines.isEmpty())
                    { 
                        for(String s: manyLines)
                        {
                            String result = s.replaceAll("(?i)\\b([a-z]+)\\b(?:\\s+\\1\\b)+", "$1");
                            noRepeat.add(result);
                }
                        }
             if(!noRepeat.isEmpty())
                    { System.out.print("Remove duplicates\n");
                        for(String s: noRepeat)
                        {
                            System.out.println(s);
                }
                        }

        }

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

}
import java.util.Scanner;
导入java.io.*;
导入java.util.regex.*;
导入java.util.ArrayList;
/**
*
*@作者马吕斯
*/
公共类RegexSimple41{
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
ArrayList manyLines=新的ArrayList();
ArrayList noRepeat=新的ArrayList();
尝试
{
Scanner myfis=新扫描仪(新文件(“D:\\myfis41.txt”);
while(myfis.hasNext())
{
String line=myfis.nextLine();
String delim=System.getProperty(“line.separator”);
字符串[]行=行。拆分(delim);
用于(字符串s:行)
{
如果(!s.isEmpty()&&s!=null)
{
多烯烃。添加(s);
}
}
}
如果(!manyLines.isEmpty())
{System.out.print(“原始文本\n”);
用于(字符串s:多烯烃)
{
系统输出打印项次;
}
}
如果(!manyLines.isEmpty())
{ 
用于(字符串s:多烯烃)
{
字符串结果=s.replaceAll(“(?i)\\b([a-z]+)\\b(?:\\s+\\1\\b)+”,“$1”);
noRepeat.add(结果);
}
}
如果(!noRepeat.isEmpty())
{System.out.print(“删除重复项\n”);
用于(字符串s:noRepeat)
{
系统输出打印项次;
}
}
}
捕获(例外情况除外)
{
系统输出打印项次(ex);
}
}
}
祝你好运,下面的代码工作正常

导入java.util.Scanner

导入java.util.regex.Matcher

导入java.util.regex.Pattern

公共类DuplicateRemoveEx{

public static void main(String[] args){

    String regex="(?i)\\b(\\w+)(\\b\\W+\\1\\b)+";
    Pattern p = Pattern.compile(regex,Pattern.CASE_INSENSITIVE);

    Scanner in = new Scanner(System.in);
    int numSentences = Integer.parseInt(in.nextLine());
    while(numSentences-- >0){
        String input = in.nextLine();
        Matcher m = p.matcher(input);
        while(m.find()){
            input=input.replaceAll(regex, "$1");
        }
        System.out.println(input);
    }
    in.close();
}

}

但是我如何在我的程序中使用你的正则表达式。我有一个文件作为输入,我想使用System.out.print显示它的内容而不冗余。谢谢:-)非常感谢,但是$1的意思是什么:-)?@SocketM:这是一个特殊变量,它引用了第一个单词的内容,在本例中是第一个单词(我们希望保留)@TimPietzcker我也有同样的问题。你能帮我检查一下问题吗?.fvbuendia回答了我的问题,但他的回答还不够,因为删除重复函数不起作用。我正在搜索解决方案,但我不能。谢谢。Java是一个奇怪的怪兽。不区分大小写的标志被发送到编译,但(?I)也在正则表达式中!
public static void main(String[] args){

    String regex="(?i)\\b(\\w+)(\\b\\W+\\1\\b)+";
    Pattern p = Pattern.compile(regex,Pattern.CASE_INSENSITIVE);

    Scanner in = new Scanner(System.in);
    int numSentences = Integer.parseInt(in.nextLine());
    while(numSentences-- >0){
        String input = in.nextLine();
        Matcher m = p.matcher(input);
        while(m.find()){
            input=input.replaceAll(regex, "$1");
        }
        System.out.println(input);
    }
    in.close();
}