提取两个相同字符之间的字符串

3

我知道如何提取介于两个不同字符串之间的字符串,比如 [ 和 ],或者 ( ) 等等...

但我不知道如何获取一个字符之间的多个/所有字符串。 例如:

the *big* brown fox *jumps over* the *lazy* **dog**

它应该针对“*”返回:

big
jumps over
lazy

并且它还应该返回“**”的结果:
dog

所有的库、正则表达式模式等都不支持这种功能。


2
在循环中使用 indexOfsubstring - Yassin Hajaj
1
创建符合您条件的自定义方法,并使用StringBuilder构建输出字符串。 - Ricardo
你需要使用类似于“(\ * \ w + \ )”和“(\ \ * \ w + \ * \ *)”的组进行正则表达式匹配。请参阅https://dev59.com/71XTa4cB1Zd3GeqP48hv - kofemann
3个回答

5

这个正则表达式:

[\*]+([a-z ]*)[\*]+

这将匹配您要查找的内容。请参见此处

  • [\*]+在结尾处匹配1个或多个*
  • ([a-z ]*)匹配a-z和空格之间的字符,并返回该字符。

现在,由于Andy Turner指出它也会在*dog*********中匹配dog,您可以这样做:

[\*]{1,2}([a-z ]*)[\*]{1,2}

这将匹配1到2个*。 (见这里) 您可以更改为任何范围,但请注意,{1,3}将匹配1、2或3次,而不仅是1和3次。


2
这不太对 - 它没有匹配相同的起始和结束。例如,它会匹配 *dog********** (对于 **dog** 它会匹配 ****)。 - Andy Turner
1
@AndyTurner 你说得对。但那不是一个要求,是吗? - dryairship
@AndyTurner 没有**dog**的编号。它会匹配dog,看到链接了吗? - dryairship
@MilanvanDijck 不,它不会。[\*]+ 尝试尽可能匹配多个 *。所以,它们已经消失了。我们只返回在 () 之间的部分。 - dryairship
哦,好的。但它确实与 *dog********** 匹配。 - Andy Turner
@AndyTurner 是的,但是OP并没有说它不应该这样做.. ;) - dryairship

0
String str="the *big* brown fox *jumps over* the *lazy* **dog**"    
str = str.replace("**", "*");

然后执行你正在使用的提取方法


有一种更优雅的方法可以解决它(使用正则表达式),但这种方法并不是错误的,也不应该被踩。 - Milan van Dijck

0
String test = "the *big* brown fox *jumps over* the *lazy* **dog**";

StringTokenizer st = new StringTokenizer(test,"*");

while (st.hasMoreTokens()) {
    System.out.println(st.nextToken());
}

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