gpt4 book ai didi

匹配输入中的 Java 正则表达式

转载 作者:行者123 更新时间:2023-11-29 08:56:30 24 4
gpt4 key购买 nike

我正在尝试使用正则表达式获取带引号的字符串。

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'=>'<input type="text" maxlength="3" class="qty_text" id='.$key.' value ='

结果应该是

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

最佳答案

当出现匹配的字符串时,您的正则表达式似乎可以正常工作;当它无法匹配时,它就会进入无限循环。 (在这种情况下,是 \D 导致它阻塞。)但是那个正则表达式比它需要的要复杂得多;你试图匹配它们,而不是验证它们。下面是 C 风格语言中字符串文字的典型正则表达式:

"[^"\\\r\n]*(?:\\.[^"\\\r\n]*)*"

...以及单引号版本,用于支持该样式的语言:

'[^'\\\r\n]*(?:\\.[^'\\\r\n]*)*'

它使用 Friedl 的“展开循环”技术来实现最高效率。这是它的 Java 代码,由 RegexBuddy 4 生成:

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

关于匹配输入中的 Java 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20082746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com