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
匹配器输入中的Java regexp_Java_Regex_Matcher - Fatal编程技术网

匹配器输入中的Java regexp

匹配器输入中的Java regexp,java,regex,matcher,Java,Regex,Matcher,我正在尝试使用regexp获取带引号的字符串 String regexp = "('([^\\\\']+|\\\\([btnfr\"'\\\\]|[0-3]?[0-7]{1,2}|u[0-9a-fA-F]{4}))*'|\"([^\\\\\"]+|\\\\([btnfr\"'\\\\]|[0-3]?[0-7]{1,2}|u[0-9a-fA-F]{4}))*\")"; Pattern p = Pattern.compile(regexp); Matcher m = p.matcher(source

我正在尝试使用regexp获取带引号的字符串

String regexp = "('([^\\\\']+|\\\\([btnfr\"'\\\\]|[0-3]?[0-7]{1,2}|u[0-9a-fA-F]{4}))*'|\"([^\\\\\"]+|\\\\([btnfr\"'\\\\]|[0-3]?[0-7]{1,2}|u[0-9a-fA-F]{4}))*\")";
Pattern p = Pattern.compile(regexp);
Matcher m = p.matcher(source); 
while (m.find()) {
    String newElement = m.group(1);
    //...
}
它工作得很好,但是如果源文本包含

'onkeyup=“this.value=this.value.replace(/\D/,\'\”)“>”

程序进入永恒循环

如何正确获取此字符串

例如,我有一个文本(php代码):


'qty'=>”也许我误解了这个原则,但现在您添加了这个示例,这看起来很简单

举个例子:

String input = "'qty'=>'<input type=\"text\" maxlength=\"3\" class=\"qty_text\" id='.$key.' value ='";
String otherInput = "' onkeyup=\"this.value = this.value.replace (/\\D/, \'\')\">'";
// matching anything starting with single quote and ending with single quote 
// included, reluctant quantified
Pattern p = Pattern.compile("'.+?'");
Matcher m = p.matcher(input);
while (m.find()) {
    System.out.println(m.group());
}
m = p.matcher(otherInput);
System.out.println();
while (m.find()) {
    System.out.println(m.group());
}
String输入=“'qty'=>”;
//匹配以单引号开始并以单引号结束的任何内容
//包括的,不情愿的
模式p=模式.compile(“.+?”);
匹配器m=p.Matcher(输入);
while(m.find()){
System.out.println(m.group());
}
m=p.matcher(其他输入);
System.out.println();
while(m.find()){
System.out.println(m.group());
}
输出:

'qty'
'<input type="text" maxlength="3" class="qty_text" id='
' value ='

' onkeyup="this.value = this.value.replace (/\D/, '
')">'
“数量”
''

请参阅Java
模式
,了解更多详细说明

既不匹配反斜杠也不匹配引号的字符组不应后跟
+
。移除
+
es以修复挂起(这是由于)

另外,原始正则表达式没有将
\D
识别为有效的反斜杠转义-因此测试输入中包含
\D
的字符串常量不匹配。如果您使正则表达式的规则更加自由,可以将紧跟反斜杠之后的任何字符识别为字符串常量的一部分,那么它的行为将与您期望的方式相同

"('([^\\\\']|\\\\.)*'|\"([^\\\\\"]|\\\\.)*\")"

当显示与之匹配的字符串时,您的正则表达式似乎工作正常;当它无法匹配时,它就会进入无休止的循环。(在本例中,是
\D
导致它阻塞。)但正则表达式比它需要的复杂得多;您试图匹配它们,而不是验证它们。下面是C风格语言中字符串文本的典型正则表达式:

“[^”\\\r\n]*(?:\\.[^”\\\r\n]*)*”
…和单引号版本,适用于支持该样式的语言:

“[^'\\\r\n]*(?:\\.[^'\\\r\n]*)*”
它使用Friedl的“展开循环”技术来实现最大效率。下面是由RegexBuddy 4生成的Java代码:

Pattern regex = Pattern.compile(
    "\"[^\"\\\\\r\n]*(?:\\\\.[^\"\\\\\r\n]*)*\"|'[^'\\\\\r\n]*(?:\\\\.[^'\\\\\r\n]*)*'"
);

您可以使用带有正确正则表达式的
split()
在一行中完成所有操作:

String[] array = source.replaceAll("^[^']+", "").split("(?<!\\G.)(?<=').*?(?='|$)");
输出:

['qty', '<input type="text" maxlength="3" class="qty_text" id=', ' value =']

['qty','我不确定我是否理解您在这里的目标。您可以发布一些输入->输出的示例吗?
'.*?
将导致包含转义单引号的单引号字符串常量的截断匹配。是的,这更容易理解,但是否使用它取决于OP希望与正则表达式匹配的输入。如果她只是有一个小的输入集,她知道在单引号字符串中不包含单引号,最小匹配解决方案就可以了。如果它在运行未知输入时必须正确运行,她将需要一个更像原始的正则表达式。我尝试删除
+
es,但从源字符串
'qty'=>''
我得到了结果
['qty',那是因为原始正则表达式中有一个bug(它认为
\D
无效)。我已经更新了我的答案。感谢详细的解释。对于我的示例,它是有效的。我用
$cart=$this->session->userdata('cart');$this->load->view('footer');
我预期的结果是
['cart',footer']
。但我得到的结果是
$cart=$this->session->userdata('cart');$this->load->view('footer')
你读了我的全部答案了吗,特别是关于处理不以引号开头的输入的第二部分?我的代码工作得很好:它会产生你想要的结果。为了更简单,我编辑了我的答案,假设输入不以引号开头。我读了两遍(或者更多)。抱歉,我在第一条评论中出错。您的代码运行正常,但如果输入内容包含
\n
则会失败。当
String source=“$cart=$this->session->userdata('cart');\n$this->load->view('footer');;;
结果是
['cart');$this->load->view(',');][/code>时,我用
字符串[]数组=source replaceAll(^[^')+|[\\r\\n]“,”).split((?若要处理换行符,请尝试将“dot all”标志
(?s)
添加到拆分正则表达式:
replaceAll(^[^']+”,“”)。split(?s)(?
String[] array = source.replaceAll("^[^']+", "").split("(?<!\\G.)(?<=').*?(?='|$)");
String source = "'qty'=>'<input type=\"text\" maxlength=\"3\" class=\"qty_text\" id='.$key.' value ='";
String[] array = source.replaceAll("^[^']+", "").split("(?<!\\G.)(?<=').*?(?='|$)");
System.out.println(Arrays.toString(array));
['qty', '<input type="text" maxlength="3" class="qty_text" id=', ' value =']