我正在尝试构建这个简单的正则表达式以匹配Java中的单词+空格,但我很困惑,试图解决它。这个网站上有很多类似的例子,但答案主要是给出正则表达式本身而不解释它是如何构造的。
我正在寻找的是形成正则表达式背后的思路。
示例输入字符串:
String Tweet = "\"Whole Lotta Love\" - Led Zeppelin";
打印时:"Whole Lotta Love" - Led Zeppelin
问题陈述:
我想知道String中是否有引号。在上面的示例字符串中,Whole Lotta Love
是引号。
我尝试了什么:
我的第一种方法是匹配两个双引号之间的任何内容,所以我想出了以下正则表达式:
"\"(\\w+\")"
和"\"(^\")"
但是这种方法只有在两个双引号之间没有空格时才有效,例如:
"Whole" Lotta Love
所以我试着修改我的正则表达式来匹配空格,这就是我迷路的地方。
我尝试了以下内容,但它们不匹配
"\"(\\w+?\\s+\")"
,"\"(\\w+)(\\s+)\""
,"\"(\\w+)?(\\s+)\""
如果有人可以帮我弄清楚如何构建这个,我将不胜感激。
答案 0 :(得分:4)
你几乎拥有它。您的正则表达式将匹配字母数字字符后跟空格,如下所示:
"Whole "
但之后没有任何字母数字字符。 zEro几乎是正确的,但你可能想要使用这样的捕获:
"\"([\\w\\s]+)\""
这匹配一个或多个[whitespace / alphanumeric]字符。请注意,字母数字包括_
。
如果你想更通用,你可以使用
"\"([^\"]+)\""
除了双引号外,还匹配所有。例如,"谁是谁?" (包括引号)将由第二个正则表达式匹配,但不与第一个正则表达式匹配,因为它包含标点符号。
答案 1 :(得分:2)
最简单的方法是让while
循环查找输入中两个引号之间的任何内容,以便检查多个带引号的表达式。
这里我的例子接受两个引号之间的任何内容。您只能使用字母和空格进行优化。
String quotedTweet = "\"Whole Lotta Love\" - Led Zeppelin";
String unquotedTweet = "Whole Lotta Love from Led Zeppelin";
String multipleQuotes = "\"Whole Lotta Love\" - \"Led\" Zeppelin";
// commented Pattern for only alphabetics or spaces
// Pattern pattern = Pattern.compile("\"([\\p{Alpha}\\p{Space}]+?)\"");
Pattern pattern = Pattern.compile("\"(.+?)\"");
Matcher matcher = pattern.matcher(quotedTweet);
while (matcher.find()) {
// will find "Whole Lotta Love"
System.out.println(matcher.group(1));
}
matcher = pattern.matcher(unquotedTweet);
while (matcher.find()) {
// will find nothing
System.out.println(matcher.group(1));
}
matcher = pattern.matcher(multipleQuotes);
while (matcher.find()) {
// Will find "Whole Lotta Love" and "Led"
System.out.println(matcher.group(1));
}
修改此示例,评论的变体不会阻止引用的空格,如" "
中所示。如果这是一个要求,请告诉我 - 在这种情况下,模式会更复杂一些。
输出:
Whole Lotta Love
Whole Lotta Love
Led
答案 2 :(得分:1)
您可以使用:
\"(?>\\w+ *)+\"
或zEro建议的角色类。
答案 3 :(得分:0)
[\w\s]+
我们可以使用它,因为我们需要分隔句子。例如,如果我们需要从"hi I am Sandun"
中获取句子。
然后我们可以使用
"+[\w\s]+"
。