【问题标题】:Java regex content between single quotes单引号之间的 Java 正则表达式内容
【发布时间】:2013-05-20 17:30:22
【问题描述】:

我正在尝试用 Java 编写一个正则表达式来查找单引号之间的内容。有人可以帮我解决这个问题吗?我尝试了以下方法,但在某些情况下不起作用:

Pattern p = Pattern.compile("'([^']*)'");
  1. 测试用例:“Tumblr”是一款了不起的应用预期输出:Tumblr

  2. 测试用例:Tumblr 是一个了不起的“应用”预期输出:应用

  3. 测试用例:Tumblr 是一款“令人惊叹”的应用 预期输出:令人惊叹

  4. 测试用例: Tumblr 是“很棒”和“惊人”预期输出: 很棒,很棒

  5. 测试用例:Tumblr 的用户很失望预期输出:无

  6. 测试用例:Tumblr 的“获取”已完成,但用户的忠诚度值得怀疑预期输出:获取

感谢您对此提供的任何帮助。

谢谢。

【问题讨论】:

  • 实际上没有必要在引号内强制使用无空格(这会使 'awesone and Amazing' 不匹配),你可以看看引号。跨度>

标签: java regex quotes


【解决方案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+)*'
    

    【讨论】:

      猜你喜欢
      • 2013-04-12
      • 2014-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多