匹配交替序列的正则表达式

3

我是一名Java开发者,目前遇到了匹配重复序列的问题。我想要匹配如下内容:

a.b.c.d.e.f.g.

能够提取分隔符之间的文本(例如,返回abcdefg),其中分隔符可以是多个非单词字符,而文本可以是多个单词字符。这是我目前的正则表达式:

([\\w]+([\\W]+)(?:[\\w]+\2)*)

(无法正常工作)

我本打算使用这个正则表达式将分隔符放在第二组,然后在第一组上使用replaceAll将分隔符替换为空字符串,从而只得到文本。我得到了分隔符,但无法获取所有的文本。

感谢您的任何帮助!


请指定您要捕获的部分与周围环境的区别,以及您想要作为分隔符的非单词字符的类型。 - Svante
4个回答

1

使用正则表达式将(\w+)\W+替换为$1


哎呀...你说得对,这就够了。我当时在想什么,为什么要将最后一部分与 $ 匹配,让它看起来比实际复杂?+1 :) - Amarghosh

0
为什么不使用 String.split

问题在于该文本将出现在一个没有常规模式的较大主体内。 - Eric Conner
我猜你需要修改你的示例来展示不规则性。目前为止,我仍然不明白为什么 "yourStr".split(/\W+/) 不够用。 - kennytm

0

使用正则表达式 (\w+)(\W+|$) 替换为 $1。确保全局标志已打开。

它将一系列单词字符后跟一系列非单词字符或行尾的序列替换为单词序列。

String line = "Am.$#%^ar.$#%^gho.$#%^sh";
line = line.replaceAll("(\\w+)(\\W+|$)", "$1");
System.out.println(line);//prints my name

尝试使用 line.replaceAll("([\w]+)([\W]+)", "\1"); 但它只产生了输入字符串的最后一个字母 "g"。 - Eric Conner
请将以下与编程有关的内容从英语翻译为中文。仅返回翻译后的文本:使用$1进行替换。/1用于在正则表达式中进行反向引用-那是个笔误 :( - Amarghosh
请查看@Ruben的答案。只需要(\\w+)\\W+ - 最后一部分不需要被替换。<找个东西敲我头> - Amarghosh

0

为什么不...

  • 找到所有(\w+)的出现并将它们连接起来;或者
  • 找到所有非单词字符(\W+),然后使用Matcher.html#replaceAll替换为空字符串?

输入中有一些非单词字符很重要,因此将它们全部替换不会按照我所需的方式工作。我需要仅在这种特定模式后面跟随一个长度为4个或更多字符的序列(例如a.b.)时剥离它们。 - Eric Conner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接