如何将正则表达式拆分为此字符串

时间:2013-07-18 19:16:18

标签: java regex

我试图理解在这种split / Pattern.compile

的情况下regex如何工作

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

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

如何使用正则表达式实现这一目标?或者甚至用更长的名字而不是"flowVars"可能是别的东西。

编辑:

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

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 个答案:

答案 0 :(得分: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']]";

您可以将Java的PatternMatcher与以下正则表达式一起使用:

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

这意味着:任何以“#[flowVars ['”开头,但不包括匹配(?<=#\[flowVars\[')中的内容,然后是许多非引号[^'](它为您提供所有内容)直到它看到的第一个引用。)

从那里循环遍历匹配器组,不需要嵌套循环。

答案 1 :(得分:0)

这应该有效:

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

或者甚至更简单:

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

答案 2 :(得分:0)

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

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

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

捕获组件的工作方式如下:

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

然后从那里,您可以通过调用

来获取捕获组
string output = m.group(1);

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

希望这有用!

答案 3 :(得分: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("\\']",""));
    }