给出以下句子:
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。
答案 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+\\))*"
(?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 (#)