我想删除双引号或单引号或反引号中的字符串以及包含的字符。
输入是:
Lorem ipsum "'dolor sit amet consectetur'" adipiscing "elite" ellentesque
scelerisque 'tortor' tortor in `vestibulum` dolor
预期产出:
Lorem ipsum adipiscing ellentesque scelerisque tortor in dolor
我有这段代码,但结果没有变化。谁能告诉我我的代码有什么问题?
line.replaceAll("[\'\"\\`].*[\'\"\\`]$", "");
答案 0 :(得分:3)
你的正则表达式存在三个问题。
"'`
中任何 "'`
之一的文本,而不一定是开始匹配的文本。< / LI>
*
贪婪,这意味着它会匹配来自第一个"
,'
或`
的文字到最后一个的文字这条线。$
结尾,所以只有当文本以整个字符串的结尾结束时才会匹配文本。你可以这样试试:
sb.append(line.replaceAll("(?:([\"'`])[^\\1]*?\\1)\\s+|\r?\n", ""));
输入:
Lorem ipsum "'dolor sit amet consectetur'" adipiscing "elite" ellentesque
scelerisque 'tortor' tortor in `vestibulum` dolor
输出:
Lorem ipsum adipiscing ellentesque scelerisque tortor in dolor
这里有正则表达式的解释和演示:http://regex101.com/r/iK3fQ8
答案 1 :(得分:1)
将贪婪的匹配器.*
更改为.+?
(非贪婪)。
并指定替换值。
完整代码:
line = line.replaceAll("([\'\"\\`]).+?\1", "");
感谢tobias_k指出我可以使用反向引用。
同时检查java的转义规则并相应地转义。
答案 2 :(得分:1)
\".*?\"|\'.*?\'|`.*`
答案 3 :(得分:1)
为了提高代码的可读性,我将其拆分为几个正则表达式:
line = line.replaceAll("\".*?\"", "");
line = line.replaceAll("'.*?'", "");
line = line.replaceAll("`.*?`", "");
(未经测试,可能需要另外一个代表性)
答案 4 :(得分:1)
l=line;
l=l.replaceAll("\"[^\"]+\"","");
l=l.replaceAll("'[^\"]+'","");
l=l.replaceAll("`[^\"]+`","");
解释
"
- 使用"
[^"]+
- 找到至少一张不是"
"
- 找到结束"
同样的&#39;和`