Java正则表达式匹配双引号子字符串
我要分析以下字符串:Java正则表达式匹配双引号子字符串,java,regex,Java,Regex,我要分析以下字符串: String text = "\"w1 w\"2\" w3 | w4 w\"5 \"w6 w7\""; // "w1 w"2" w3 | w4 w"5 "w6 w7" 我使用的是Pattern.compile(regex).matcher(text),所以这里缺少的是正确的regex。 规则是regex必须: 孤立任何一个单词 任何被双引号包围的子字符串都是匹配项 必须忽略单词中的双引号(稍后我将用空格替换它们) 因此,结果匹配应为: w1 w“2 w3 | w4 w
String text = "\"w1 w\"2\" w3 | w4 w\"5 \"w6 w7\"";
// "w1 w"2" w3 | w4 w"5 "w6 w7"
我使用的是Pattern.compile(regex).matcher(text)
,所以这里缺少的是正确的regex。
规则是regex必须:
- 孤立任何一个单词
- 任何被双引号包围的子字符串都是匹配项
- 必须忽略单词中的双引号(稍后我将用空格替换它们)
"\"(.*)\"|(\\S+)"
我还尝试了上述正则表达式的许多不同变体(包括lookback/forward),但没有一个能给我预期的结果
关于如何改进这一点,你有什么想法吗?这似乎很管用:
“(?:[^”]|\b“\b)+”|\S+
请注意,在Java中,因为我们对正则表达式使用字符串文字,所以反斜杠前面需要加上另一个反斜杠:
String regex=“\”(?:[^\“]\\\b\“\\b)+\“\\\\S+”;
试试这个正则表达式:
<代码>(?):(怎么可能有一个字符串覆盖了<代码> >“<代码>有多个<代码>”/代码> s?它不会直接考虑<代码> W1W<代码>作为一个词,而不是<代码> W1W“2 < /代码>?也许我误解了您的问题,但我认为您可能会有一个矛盾的要求:“一个词内的双引号必须被忽略”。.Java正则表达式中的一个单词被定义为
[A-Za-z0-9\]
(请参阅),因此你不能在一个单词中有“
”…试试String pat=“\”[^\”]*(?:\\b\“\\b[^\”]*)*“\\\\\\\\\S+”
@拖拉者;@anothernode:你在Java正则表达式中对单词的严格定义是正确的,我这里的意思是将单词一分为二“,这仍然应该被视为一个单引号(让我传递定义)…word。我认为根据预期的输出1和6,不需要周围的双引号。@Gurman True,但我无法找到忽略周围引号的解决方案。不过,这可以很容易地在第二个短语中完成。仅供参考“\”(?:[^\”]\\\b\\\b)+\“| \\S+”
将匹配与相同的字符串,但此字符串将稍慢一点。@WiktorStribiżew True,good point。那么,请随意添加您的字符串作为答案;)你找到忽略周围引号的方法了吗?@sp00m这是不可能的。只需使用一个捕获组,如果它不为空,则添加到最终的字符串列表中。最后,我对此进行了轻微的自定义。谢谢。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MyClass {
public static void main(String args[]) {
final String regex = "(?:(?<=^\")|(?<=\\s\")).*?(?=\"(?:\\s|$))|(?![\\s\"])\\S+";
final String string = "\"w1 w\"2\" w3 | w4 w\"5 \"w6 w7\"";
final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
}
}