Java-从模式中提取字符串
给定一些如下所示的字符串:Java-从模式中提取字符串,java,regex,Java,Regex,给定一些如下所示的字符串: (((((((((((((4)+13)*5)/1)+7)+12)*3)-6)-11)+9)*2)/8)-10) (((((((((((((4)+13)*6)/1)+5)+12)*2)-7)-11)+8)*3)/9)-10) (((((((((((((4)+13)*6)/1)+7)+12)*2)-8)-11)+5)*3)/9)-10) [4,5,1,7,3,6,9,2,8] (顺便说一句,它们是我为之编写程序的谜题的解决方案:)) 他们都有这种模式 "(((((((
(((((((((((((4)+13)*5)/1)+7)+12)*3)-6)-11)+9)*2)/8)-10)
(((((((((((((4)+13)*6)/1)+5)+12)*2)-7)-11)+8)*3)/9)-10)
(((((((((((((4)+13)*6)/1)+7)+12)*2)-8)-11)+5)*3)/9)-10)
[4,5,1,7,3,6,9,2,8]
(顺便说一句,它们是我为之编写程序的谜题的解决方案:))
他们都有这种模式
"(((((((((((((.)+13)*.)/.)+.)+12)*.)-.)-11)+.)*.)/.)-10)"
For 1解决方案:如何获得具有此给定模式的值?
因此,对于第一个解决方案,我将得到一个集合、列表和数组(无所谓),如下所示:
(((((((((((((4)+13)*5)/1)+7)+12)*3)-6)-11)+9)*2)/8)-10)
(((((((((((((4)+13)*6)/1)+5)+12)*2)-7)-11)+8)*3)/9)-10)
(((((((((((((4)+13)*6)/1)+7)+12)*2)-8)-11)+5)*3)/9)-10)
[4,5,1,7,3,6,9,2,8]
实际上,通过提供模式,您已经完成了大部分工作。您所需要做的就是在
所在的位置使用捕获组(并跳过其余部分)
我将您的输入放入一个字符串
数组,并将结果放入一个整数列表
(正如您所说,您可以将其更改为其他内容)。至于图案,你要捕捉点;这是通过用(
和)
包围它们来实现的。在您的例子中,问题是整个字符串都充满了它们,因此我们需要引用/转义它们(这意味着,告诉regex编译器我们指的是文本/字符(
和)
)。这可以通过将要转义的部分放在\Q
和\E
之间来实现
下面的代码展示了一种连贯的方法(尽管可能并不有效)。只需小心在正确的位置使用适量的\
:
public class Example {
public static void main(String[] args) {
String[] inputs = new String[3];
inputs[0] = "(((((((((((((4)+13)*5)/1)+7)+12)*3)-6)-11)+9)*2)/8)-10)";
inputs[1] = "(((((((((((((4)+13)*6)/1)+5)+12)*2)-7)-11)+8)*3)/9)-10)";
inputs[2] = "(((((((((((((4)+13)*6)/1)+7)+12)*2)-8)-11)+5)*3)/9)-10)";
List<Integer> results;
String pattern = "(((((((((((((.)+13)*.)/.)+.)+12)*.)-.)-11)+.)*.)/.)-10)"; // Copy-paste from your question.
pattern = pattern.replaceAll("\\.", "\\\\E(.)\\\\Q");
pattern = "\\Q" + pattern;
Pattern p = Pattern.compile(pattern);
Matcher m;
for (String input : inputs) {
m = p.matcher(input);
results = new ArrayList<>();
if (m.matches()) {
for (int i = 1; i < m.groupCount() + 1; i++) {
results.add(Integer.parseInt(m.group(i)));
}
}
System.out.println(results);
}
}
}
笔记:
- 您正在使用单个
,这意味着 任何字符(可能与行终止符匹配,也可能不匹配) 因此,如果您有一个不是一个数字的数字或一个不是数字(数字)的字符,则匹配项或
中会出现错误。考虑<代码> \d代码>代码,以表示一个数字或“代码> \d++/c>”,以代替数字。parseInt
- 有关Java中正则表达式的更多信息,请参阅