Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-从模式中提取字符串_Java_Regex - Fatal编程技术网

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);
        }
    }
}
笔记:
  • 您正在使用单个
    ,这意味着

    任何字符(可能与行终止符匹配,也可能不匹配)

    因此,如果您有一个不是一个数字的数字或一个不是数字(数字)的字符,则
    匹配项或
    parseInt
    中会出现错误。考虑<代码> \d代码>代码,以表示一个数字或“代码> \d++/c>”,以代替数字。

  • 有关Java中正则表达式的更多信息,请参阅

Google“java正则表达式捕获组”。或者,如果所有的点都应该是一位数,只需索引到字符串中,获取第12、19、22等字符…使用正则表达式拆分(\\D+”)(并删除/忽略开头的空元素),如果不需要使用正则表达式,你也可以尝试使用扫描仪。非常感谢大家!:)@Domien:如果这个答案解决了你的问题,请考虑接受它(左边的绿色复选标记)。