【问题标题】:Extract a string between 2 characters of the same character提取相同字符的2个字符之间的字符串
【发布时间】:2016-08-20 07:42:48
【问题描述】:

我了解如何在 [ 和 ] 或 ( ) 等 2 种不同类型的字符串之间提取字符串...

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

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

它应该返回“*”:

big
jumps over
lazy

它也应该返回“**”:

dog

所有库、正则表达式模式等都不支持此类功能。

【问题讨论】:

标签: java string


【解决方案1】:

这个正则表达式:

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

将匹配您正在寻找的内容。见this

  • [\*]+ 最后匹配 1 个或多个 *s。
  • ([a-z ]*) 匹配 a-z 和空格之间的字符,并返回。

现在,既然 Andy Turner 指出它也匹配 dog 中的 *dog*********,您可以这样做:

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

这将在 1 和 2 之间匹配 *s。(请参阅 this)您可以将其更改为任何范围,但请注意 {1,3} 将匹配 1,2 或 3 次,而不仅仅是 1 和 3次。

【讨论】:

  • 这不太行 - 它不匹配相同的开始和结束。例如,它将匹配*dog**********(对于**dog**,它将匹配****)。
  • @AndyTurner 你是对的。但这不是一个要求。是吗?
  • @AndyTurner 编号为**dog**。它将匹配 dog 看到链接了吗?
  • @MilanvanDijck 不,它没有。 [\*]+ 尝试匹配尽可能多的 *s。所以,他们已经走了。我们只返回()之间的部分
  • 哦,好的。但它确实匹配*dog**********
【解决方案2】:
String str="the *big* brown fox *jumps over* the *lazy* **dog**"    
str = str.replace("**", "*");

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

【讨论】:

  • 有一种更优雅的方法来解决它(使用正则表达式),但这并没有错,不应该被否决。
【解决方案3】:
String test = "the *big* brown fox *jumps over* the *lazy* **dog**";

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多