gpt4 book ai didi

java - 检索带引号的字符串和引号字符的正则表达式

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:01:39 26 4
gpt4 key购买 nike

我有一种语言将字符串定义为由单引号或双引号分隔,其中分隔符通过加倍在字符串中转义。例如,以下都是合法的字符串:

'This isn''t easy to parse.'
'Then John said, "Hello Tim!"'
"This isn't easy to parse."
"Then John said, ""Hello Tim!"""

我有一组字符串(如上定义),由不包含引号的内容分隔。我正在尝试使用正则表达式来解析列表中的每个字符串。例如,这是一个输入:

"Some String #1" OR 'Some String #2' AND "Some 'String' #3" XOR
'Some "String" #4' HOWDY "Some ""String"" #5" FOO 'Some ''String'' #6'

判断字符串是否为这种形式的正则表达式很简单:

^(?:"(?:[^"]|"")*"|'(?:[^']|'')*')(?:\s+[^"'\s]+\s+(?:"(?:[^"]|"")*"|'(?:[^']|'')*')*

在运行上面的表达式来测试它是否是这种形式之后,我需要另一个正则表达式来从输入中获取每个分隔字符串。我计划按如下方式执行此操作:

Pattern pattern = Pattern.compile("What REGEX goes here?");
Matcher matcher = pattern.matcher(inputString);
int startIndex = 0;
while (matcher.find(startIndex))
{
String quote = matcher.group(1);
String quotedString = matcher.group(2);
...
startIndex = matcher.end();
}

我想要一个正则表达式来捕获组 #1 中的引号字符,以及组 #2 中引号内的文本(我使用的是 Java Regex)。因此,对于上述输入,我正在寻找一个在每次循环迭代中产生以下输出的正则表达式:

Loop 1: matcher.group(1) = "
matcher.group(2) = Some String #1
Loop 2: matcher.group(1) = '
matcher.group(2) = Some String #2
Loop 3: matcher.group(1) = "
matcher.group(2) = Some 'String' #3
Loop 4: matcher.group(1) = '
matcher.group(2) = Some "String" #4
Loop 5: matcher.group(1) = "
matcher.group(2) = Some ""String"" #5
Loop 6: matcher.group(1) = '
matcher.group(2) = Some ''String'' #6

到目前为止我尝试过的模式(未转义,然后是针对 Java 代码的转义):

(["'])((?:[^\1]|\1\1)*)\1
"([\"'])((?:[^\\1]|\\1\\1)*)\\1"

(?<quot>")(?<val>(?:[^"]|"")*)"|(?<quot>')(?<val>(?:[^']|'')*)'
"(?<quot>\")(?<val>(?:[^\"]|\"\")*)\"|(?<quot>')(?<val>(?:[^']|'')*)'"

在尝试编译模式时,这两个都失败了。

这样的正则表达式可以吗?

最佳答案

制作一个适合你的工具类:

class test {
private static Pattern pd = Pattern.compile("(\")((?:[^\"]|\"\")*)\"");
private static Pattern ps = Pattern.compile("(')((?:[^']|'')*)'");
public static Matcher match(String s) {
Matcher md = pd.matcher(s);
if (md.matches()) return md;
else return ps.matcher(s);
}
}

关于java - 检索带引号的字符串和引号字符的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34426058/

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