Java 使用正则表达式从文本中删除连续重复的单词并显示新文本
Hy 我有以下代码: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(
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
或ASCIIa
和ASCIIz
之间的字符(还包括[/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();
}