单引号之间的 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 正则表达式内容的主要内容,如果未能解决你的问题,请参考以下文章

在正则表达式中转义(\')单引号,它在两个单引号之间采用字符串。

Linux正则表达式中单引号双引号及不加引号的区别

正则表达式使用提升令牌迭代器提取单引号和括号之间的值

正则表达式使用 postgres regexp_replace() 用单引号替换反斜杠和单引号

Python正则表达式怎么区配引号之间的内容

正则表达式多引号选择