Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.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
Regex 在特定模式之间提取一个_Regex_Groovy_Extract - Fatal编程技术网

Regex 在特定模式之间提取一个

Regex 在特定模式之间提取一个,regex,groovy,extract,Regex,Groovy,Extract,我必须提取一些子字符串,这就像纯文本文档中的XML标记,如 lsdkfjsdklfj sdklfsdklfjsd <AAA>myString</AAA>sdfsdfsdfsdf lsdkfjsdklfj sdklfsdklfjsd mystringsdfsdfdf 我可以在一个命令中提取这个模式吗 在这种情况下,我尝试使用matcher,group命令来提取单个匹配 我不想做这样的事 String pattern = /<AAA>(.*)<\/AAA

我必须提取一些子字符串,这就像纯文本文档中的XML标记,如

lsdkfjsdklfj sdklfsdklfjsd <AAA>myString</AAA>sdfsdfsdfsdf
lsdkfjsdklfj sdklfsdklfjsd mystringsdfsdfdf
我可以在一个命令中提取这个模式吗

在这种情况下,我尝试使用matcher,group命令来提取单个匹配

我不想做这样的事

String pattern = /<AAA>(.*)<\/AAA>/;

// Create a Pattern object
Pattern r = Pattern.compile(pattern);

// Now create matcher object.
Matcher m = r.matcher("lsdkfjsdklfj sdklfsdklfjsd <AAA>myString</AAA>sdfsdfsdfsdf");
if (m.find( )) {
    System.out.println("Found value: " + m.group(0) );
}
String模式=/(.*)/;
//创建模式对象
Pattern r=Pattern.compile(Pattern);
//现在创建匹配器对象。
Matcher m=r.Matcher(“lsdkfjsdklfj sdklfsdklfjsd mystringsdfsdfsdf”);
if(m.find()){
System.out.println(“找到的值:+m.group(0));
}
一定有更优雅的方式

编辑:
谢谢你,我一直在找这样的东西

你能解释一下为什么对结果使用[0][1]吗

def extract = (input =~ '<AAA>(.+?)</AAA>')[0][1]
def extract=(输入=~'(.+?))[0][1]
蒂姆·耶茨的答复:

=~返回匹配器,因此[0]获取第一个匹配项,即2个组,第一个是包含匹配项的字符串(整个字符串),第二个[1]是在表达式中定义的组


非常感谢你的帮助,也感谢所有的读者。 社区的力量

你就不能这样做吗:

def input = 'lsdkfjsdklfj sdklfsdklfjsd <AAA>myString</AAA>sdfsdfsdfsdf'
def extract = (input =~ '<AAA>(.+?)</AAA>')[0][1]
assert extract == 'myString'
def输入='lsdkfjsdklfj sdklfsdklfjsd mystringsdfsdfdf'
def extract=(输入=~'(.+?))[0][1]
assert extract=='myString'
这是我能想到的没有外部LIB的最短(不是最好)的方法:

String str = "lsdkfjsdklfj sdklfsdklfjsd <AAA>myString</AAA>sdfsdfsdfsdf";
System.out.println(str.substring(str.indexOf(">") + 1, str.lastIndexOf("<")));
String str=“lsdkfjsdklfj sdklfsdklfjsd(这比我之前使用substring的建议好几百万倍):

StringUtils.substringBetween(str,“,”);

我还是会选择
matcher()
就像你提出的那样。

使用正则表达式和匹配器有什么问题?你怎么能在Java中像正则表达式一样使用js?我只是觉得它有点长:)@SashaSalauyou你不能。OP的代码不会这样编译。@julienasefth如果你认为它长,那么创建一个方法,它接受两个字符串/regex值并输入并返回提取的值文本作为单个字符串或列表。谢谢你,我一直在寻找类似的内容。你能解释一下为什么在def extract=(input=~'(.+?)')[0][1]
=~
返回一个匹配符,因此
[0]
获得第一个匹配项,即两个组,第一个是其中包含匹配项的字符串(您的整个字符串)第二个
[1]
是您在表达式中定义的组。非常感谢您的帮助,感谢所有读者。社区的力量!!!
StringUtils.substringBetween(str, "<AAA>", "</AAA>");