单引号之间的 Java 正则表达式内容
Posted
技术标签:
【中文标题】单引号之间的 Java 正则表达式内容【英文标题】:Java regex content between single quotes 【发布时间】:2013-05-20 17:30:22 【问题描述】:我正在尝试用 Java 编写一个正则表达式来查找单引号之间的内容。有人可以帮我解决这个问题吗?我尝试了以下方法,但在某些情况下不起作用:
Pattern p = Pattern.compile("'([^']*)'");
测试用例:“Tumblr”是一款了不起的应用预期输出:Tumblr
测试用例:Tumblr 是一个了不起的“应用”预期输出:应用
测试用例:Tumblr 是一款“令人惊叹”的应用 预期输出:令人惊叹
测试用例: Tumblr 是“很棒”和“惊人”预期输出: 很棒,很棒
测试用例:Tumblr 的用户很失望预期输出:无
测试用例:Tumblr 的“获取”已完成,但用户的忠诚度值得怀疑预期输出:获取
感谢您对此提供的任何帮助。
谢谢。
【问题讨论】:
实际上没有必要在引号内强制使用无空格(这会使 'awesone and Amazing' 不匹配),你可以看看引号。跨度> 【参考方案1】:这应该可以解决问题:
(?:^|\s)'([^']*?)'(?:$|\s)
示例:http://www.regex101.com/r/hG5eE1
在Java (ideone):
import java.util.*;
import java.lang.*;
import java.util.regex.*;
class Main
static final String[] testcases = new String[]
"'Tumblr' is an amazing app",
"Tumblr is an amazing 'app'",
"Tumblr is an 'amazing' app",
"Tumblr is 'awesome' and 'amazing' ",
"Tumblr's users' are disappointed ",
"Tumblr's 'acquisition' complete but users' loyalty doubtful"
;
public static void main (String[] args) throws java.lang.Exception
Pattern p = Pattern.compile("(?:^|\\s)'([^']*?)'(?:$|\\s)", Pattern.MULTILINE);
for (String arg : testcases)
System.out.print("Input: "+arg+" -> Matches: ");
Matcher m = p.matcher(arg);
if (m.find())
System.out.print(m.group());
while (m.find()) System.out.print(", "+m.group());
System.out.println();
else
System.out.println("NONE");
【讨论】:
我意识到,随着我测试更多场景,您的答案更加稳健。希望我有足够的声誉来支持答案。 它并不完整,因为单引号是输出的一部分;-)。它可以用 m.group().replace('\'', '\u0000') 修复 @dermoritz 不需要;相同的正则表达式将捕获在 group(0) 中带引号的字符串,在 group(1) 中不带引号。 ideone.com/m9t1AF @ᴳᵁᴵᴰᴼ。我有一个小问题。所以,我想纠正以下字符串的模式。 “‘Tumblr’是“一个了不起的”应用程序”、“Tumblr 是一个了不起的‘应用程序’”、“Tumblr 是一个“只有国家公民才能拥有土地”。老外’”、“Tumblr 是‘棒极了’和‘惊人的’”、“Tumblr 的‘用户’‘很失望’ss”、“Tumblr 的‘收购’完成但用户的忠诚度值得怀疑”,如果你知道请告诉我。 【参考方案2】:试试这个简单的正则表达式模式:
'([^\s']+)'
和一个测试代码:
try
Pattern regex = Pattern.compile("'([^\\s']+)'");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find())
for (int i = 1; i <= regexMatcher.groupCount(); i++)
// matched text: regexMatcher.group(i)
// match start: regexMatcher.start(i)
// match end: regexMatcher.end(i)
catch (PatternSyntaxException ex)
// Syntax error in the regular expression
【讨论】:
【参考方案3】:只是不要让' '
出现在输出中。使用这个正则表达式:
'([^' ]*)'
或者确保引号对用空格包裹。
(?:^|)'([^']*)'(?: |$)
【讨论】:
这不匹配“...'惊人而美丽'...” @guido 试试新的解决方案。 更好,但你仍然有空格而不是空格,并且没有行尾(然后就像我的;-)【参考方案4】:如果您不允许单引号字符 '
或空格字符 ' '
出现在模式中,那么您就可以开始了。我使用了+
,因为我假设您不想要一个空条目(如果不是,请将其改回*
):
Pattern p = Pattern.compile("'([^' ]+)'");
【讨论】:
这适用于输入,应该注意的是 Paul Vargas 和我的模式也可以接受匹配字符串中的空格。 我同意;您的解决方案很好且有意义,但没有任何示例输入表明 OP 想要捕获多个单词,因此为了使其尽可能接近 OP 的代码/限制,我想出了这个。 @guido 你是对的。但原始海报确信这是不可能的。悲伤的故事。【参考方案5】:尝试下一个:
'\w+'|'\w+(\s\w+)*'
【讨论】:
以上是关于单引号之间的 Java 正则表达式内容的主要内容,如果未能解决你的问题,请参考以下文章
在正则表达式中转义(\')单引号,它在两个单引号之间采用字符串。