我试图理解在这种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
答案 0 :(得分:2)
正如其他人所提到的,需要更多信息,但基于您的样本的最简单方法是将所有内容都用在单引号之间:
String input = "#[flowVars['variable_name']]";
System.out.println(input.replaceAll(".*'(.*)'.*", "$1"));
这转换为:任何内容(.*
),后跟单引号('
),然后是捕获的任何内容块((.*)
),后跟单引号,后跟任何内容,取下并用捕获的块替换它。
如果你想修补它,试试:
例如,您可以使用多个捕获块,只需按顺序引用它们(第一个捕获块$1
,第二个捕获块$2
等):
System.out.println(input.replaceAll("(.*)'(.*)'(.*)", "$2, $1, $3"));
如果要选择多个变量,例如:
String input = "#[flowVars['variable_name1']]#[flowVars['variable_name2']]";
您可以将Java的Pattern
和Matcher
与以下正则表达式一起使用:
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("\\']",""));
}