在数字之间提取字符串

时间:2015-11-04 15:22:25

标签: java regex

给出以下句子:

My name is David and I am (1) tall, and am perhaps also a (2) hobby programmer with (3) skills in various, and (4) things.

是否可以在括号之间提取字符串?

我理想的结果将是一个列表:

A = ["tall, and am perahaps also a", "hobby programmer", 
"skills in various, and", "things"];

句子不需要只有4个部分,范围可以是2-20。

4 个答案:

答案 0 :(得分:2)

您可以将这些子字符串与\(\d+\)(.*?)(?=$|\(\d+\))匹配:

String s = "My name is David and I am (1) tall, and am perhaps also a (2) hobby programmer with (3) skills in various, and (4) things.";
Pattern pattern = Pattern.compile("\\(\\d+\\)(.*?)(?=$|\\(\\d+\\))");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
    System.out.println(matcher.group(1)); 
} 

请参阅IDEONE demo

如果可以有换行符,请在正则表达式中使用Pattern.DOTALL修饰符。

模式匹配:

  • \(\d+\) - 括号内的数字序列
  • (.*?) - 匹配并捕获最多的文字......
  • (?=$|\(\d+\)) - 字符串结尾或括号内的数字序列。

答案 1 :(得分:1)

您需要使用(a)将字符串拆分为分隔符,其中a为1位或更多位。

为此,您可以在\(([0-9]+)\)函数中使用正则表达式 String#split。请注意,\(匹配左括号,\)匹配结束括号。在代码中,您需要编写

str.split("\\(([0-9]+)\\)")

其中str是您的字符串。请注意\\将单个反斜杠传递给正则表达式。

这会生成一个字符串数组,您可以轻松地将其强制转换为列表。

不幸的是,这不会消除(a)周围的任何空格。为了解决这个问题,您可以(i)调整正则表达式以适应这种情况,或者(ii)在将字符串强制转换为列表时修剪字符串。请注意,正则表达式中的\s与空格相匹配(不要忘记在Java代码中需要\\s)。

答案 2 :(得分:0)

将字符串拆分为

string.split("\\(([0-9]+)\\)")

答案 3 :(得分:0)

这比第一眼看上去有点棘手 这将正确处理所有边缘情况 每个匹配包含内容n Group 1

(?s)\G(?:\(\d+\))*((?:(?!\(\d+\)).)+)(?:\(\d+\))*
"(?s)\\G(?:\\(\\d+\\))*((?:(?!\\(\\d+\\)).)+)(?:\\(\\d+\\))*"

Formatted and tested:

 (?s)                          # Modifier, dot-all
 \G                            # Start where last match ends
 (?: \( \d+ \) )*              # Consume many optional (#)
 (                             # (1 start), The content
      (?:                           # Cluster begin
           (?! \( \d+ \) )               # Assert, not (#) ahead
           .                             # Ok, grab this character
      )+                            # Cluster end, do 1 to many times
 )                             # (1 end)
 (?: \( \d+ \) )*              # Consume many optional (#)