Java 不匹配正则表达式中的转义字符

Java 不匹配正则表达式中的转义字符,java,regex,Java,Regex,我有一些绳子,在阳光明媚的日子里看起来像 'abcd' => 'efgh' 我想在以下捕获组中获取abcd和efgh "'([^']*)'\s*=>\s*'([^']*)'" 我现在的问题是,=>或\\'可能发生在捕获序列中。我已经试过了 "'([^']|[\\\\^]*)'\s*=>\s*'([^']|[\\\\']*)'" 但这并没有让我达到预期的效果。 如何将这些值过滤掉?在解析文本时,正则表达式不是正确的选择 例如,解析包括计算反斜杠、引号等的功能 使用解析器库(

我有一些绳子,在阳光明媚的日子里看起来像

'abcd' => 'efgh'
我想在以下捕获组中获取
abcd
efgh

"'([^']*)'\s*=>\s*'([^']*)'"
我现在的问题是,=>或\\'可能发生在捕获序列中。我已经试过了

"'([^']|[\\\\^]*)'\s*=>\s*'([^']|[\\\\']*)'"
但这并没有让我达到预期的效果。
如何将这些值过滤掉?

在解析文本时,正则表达式不是正确的选择

例如,解析包括计算反斜杠、引号等的功能


使用解析器库(如ANTLR),或者使用半健壮的正则表达式解决方案。

在解析文本时,正则表达式不是正确的选择

例如,解析包括计算反斜杠、引号等的功能


使用解析器库(如ANTLR),或者使用半健壮的正则表达式解决方案。

如果您想在“=>”前后获取这些字符串,可以使用以下方法:

String s = "'ab'cd' => 'e\\fg\\'h'";

Pattern p = Pattern.compile("'(.+)'\\s\\=>\\s'(.+)'");
Matcher m = p.matcher(s);

if (m.matches()) {
    System.out.println(m.group(1));
    System.out.println(m.group(2));
}

在这个具体的例子中,您将得到“ab'cd”和“e\fg\h”。

如果您想在“=>”之前和之后得到这些字符串,您可以使用:

String s = "'ab'cd' => 'e\\fg\\'h'";

Pattern p = Pattern.compile("'(.+)'\\s\\=>\\s'(.+)'");
Matcher m = p.matcher(s);

if (m.matches()) {
    System.out.println(m.group(1));
    System.out.println(m.group(2));
}

在这个具体的例子中,你会得到“ab'cd”和“e\fg\'h”。

看起来最安全的是
”([^\\\\\']*(?:\\\\\.^\\\\\\\\\\\\\\\\\\\\\\\\\\']*)“
在一个快速测试中,使用“\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\,将匹配限制为不包含它的字符串是没有意义的。如果只使用。*而不是
[^']
,会发生什么?@chenino:上面的第二条评论是写给我的吗?请不要忘记添加
@
+
用户名
,让我们知道您的反馈。请参阅“显示正则表达式完美工作”。在这种情况下,接受该答案。看起来最安全的是
”([^\\\\\\\\\]*(?:\\\\\\\..^\\\\\\\\\']*)“\\s*==>\\s*.[^\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\']]*”)”。
在使用“\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\,将匹配限制为不包含它的字符串是没有意义的。如果只使用。*而不是
[^']
,会发生什么?@chenino:上面的第二条评论是写给我的吗?请不要忘记添加
@
+
用户名
,让我们知道您的反馈。请参阅“显示正则表达式完美工作”。在这种情况下,接受该答案。如果捕获组中出现a=>则不起作用,请参阅第二条注释中的“我的示例字符串”。即使字符串s=“'\\\\'=>asdws'=>”\\\\\'ljsad=>asd';在这种情况下,您会得到“\\'=>asdws”和“\\'ljsad=>asd”。我在@WiktorStribiżew模板中输入了您的代码,但它不匹配。Sorry这不起作用,如果a=>出现在捕获组中,请参见第二条注释中的“我的示例字符串”。即使字符串s=“'\\\\'=>asdws'=>'\\\\\'ljsad=>asd'”,它也能起作用;在这种情况下,您会得到“\\'=>asdws”和“\\'ljsad=>asd”。我在@WiktorStribiżew模板中输入了您的代码,但它不匹配。很抱歉