0

我试图了解在 split/Pattern.compile 这种情况下正则表达式如何工作

这是整个字符串:"#[flowVars['variable_name']]"

我需要提取的字符串是"variable_name"

我怎样才能用正则表达式实现这一点?甚至用更长的名字代替"flowVars"可能是别的东西。

编辑:

构造了一个使用 split 和迭代两次的方法来查找引号之间的所有匹配项/变量,以防万一有人想重新使用它或修改它

private static List<String> rebuildURLWithComplexValues(String url) {

    List<String> tokens = new ArrayList<String>();;

    if(url != null && url.length() > 0) {
        if(url.contains("flowVars")) {              
            String[] firstSplit = url.split("\\[");
            for (int i = 0; i < firstSplit.length; i++) {
                if(firstSplit[i].contains("'")) {
                    StringTokenizer st = new StringTokenizer(firstSplit[i], "\'");                      
                    String tokencitu = st.nextToken();
                    tokens.add(tokencitu);
                }
            }
        }
    }
    return tokens;
}

谢谢大家 :D

4

4 回答 4

2

正如其他人所提到的,需要更多信息,但仅基于您的示例的最简单方法是将所有内容放在单引号之间:

String input = "#[flowVars['variable_name']]";
System.out.println(input.replaceAll(".*'(.*)'.*", "$1"));

这转换为:任何东西(.*),后跟单引号('),然后是捕获的任何东西块( ),(.*)然后是单引号,然后是任何东西,取它并将其替换为捕获的块。

如果您想修改它,请尝试:

http://regexr.com?35kof

例如,您可以使用多个捕获块,您只需按顺序引用它们($1对于第一个捕获块,$2对于第二个,等等):

System.out.println(input.replaceAll("(.*)'(.*)'(.*)", "$2, $1, $3"));

如果您要选择多个变量,例如:

String input = "#[flowVars['variable_name1']]#[flowVars['variable_name2']]";

您可以使用 JavaPatternMatcher以下正则表达式:

String regex = "(?<=#\[flowVars\[')[^']*";

翻译为:任何以 "#[flowVars['" 开头但不包括在 match 中的内容(?<=#\[flowVars\['),然后是许多非引号[^'](它为您提供直到它看到的第一个引号的所有内容)。

只需从那里循环遍历匹配器的组,无需嵌套循环。

于 2013-07-18T19:39:54.497 回答
0

这应该有效:

String str = "#[flowVars['variable_name']]";
String repl = str.replaceAll("^#\\[[^\\[]*\\['([^']+).*$", "$1");

或者更简单:

String repl = str..replaceAll("^#[^']*'([^']+).*$", "$1");
// repl = variable_name
于 2013-07-18T19:35:21.567 回答
0

我认为您正在寻找的东西不是通过正则表达式拆分,而是从正则表达式中获取匹配项。此正则表达式应适用于您的目的:

"#\[[A-Za-z]+\['([A-Za-z_]+)']]"

[A-Za-z] 周围的括号称为捕获。它基本上接受括号中的任何内容,并允许您事后访问它。如果您不了解正则表达式本身,可以查看此处。如果你这样做,我会解释下面的捕获片段。

捕获组部分的工作方式如下:

Pattern p = Pattern.compile("#\[[A-Za-z]+\['([A-Za-z_]+)']]");
Matcher m = p.matcher("#[flowVars['variable_name']]");

然后从那里,您可以通过调用获取捕获组

string output = m.group(1);

捕获组从索引 1 开始,因为第 0 个索引包含整个匹配的字符串。

希望这有帮助!

于 2013-07-18T19:39:47.500 回答
0

尝试这个

 String str="#[flowVars['variable_name']]";
  Pattern p=Pattern.compile("\\['.*?']");
  Matcher m=p.matcher(str);
    if(m.find()){              
        System.out.println(m.group(0).replaceAll("\\['","").replaceAll("\\']",""));
    }
于 2013-07-18T19:46:21.200 回答