3

我正在尝试编写一个正则表达式,它可以确定一个字符串是否包含奇数个"- 引号。

这个问题的回答者已经完成了非常相似的事情,以确定一串字母是否包含奇数个特定字母。但是,我无法使其适应我的问题。

到目前为止,我所拥有的,但并不完全有效:

String regexp = "(\\b[^\"]*\"(([^\"]*\"){2})*[^\"]*\\b)";
        Pattern pattern = Pattern.compile(regexp);
        Matcher matcher = pattern.matcher("bbacac");
        if(matcher.find()){
            System.out.println("Found");
        }
        else
            System.out.println("Not Found");
4

6 回答 6

10

正则表达式是一个相当糟糕的解决方案。<-- 我虽然您在谈论嵌套,而不是配对匹配。

遍历字符串中的所有字符,计算 的实例"将是实现这一目标的更快、更有效的方法。

int quoteCount = 0;
for(char ch : inputString.toCharArray())
{
  if(ch == '"') quoteCount++;
}

boolean even = quoteCount % 2 == 0;
于 2013-05-31T18:53:58.817 回答
7

如果你想要一个正则表达式,这很容易完成:

boolean oddQuotes = subjectString.matches("[^\"]*\"(?:[^\"]*\"[^\"]*\")*[^\"]*");

说明:(没有所有 Java 引用转义):

[^"]*"   # Match any number of non-quote characters, then a quote
(?:      # Now match an even number of quotes by matching:
 [^"]*"  #  any number of non-quote characters, then a quote
 [^"]*"  #  twice
)*       # and repeat any number of times.
[^"]*    # Finally, match any remaining non-quote characters

到目前为止,这可能比简单的“计算引号”解决方案要慢。但我们可以做得更好:我们可以设计正则表达式来处理转义的引号,即如果引号前面有奇数个反斜杠,则不计算引号:

boolean oddQuotes = subjectString.matches("(?:\\\\.|[^\\\\\"])*\"(?:(?:\\\\.|[^\\\\\"])*\"(?:\\\\.|[^\\\\\"])*\")*(?:\\\\.|[^\\\\\"])*");

现在诚然,这看起来很可怕,但主要是因为 Java 的字符串转义规则。实际的正则表达式很简单:

(?:       # Match either
 \\.      # an escaped character
|         # or
 [^\\"]   # a character except backslash or quote
)*        # any number of times.
"         # Then match a quote.
(?:       # The rest of the regex works just the same way (as above)
 (?:\\.|[^\\"])*"
 (?:\\.|[^\\"])*"
)*
(?:\\.|[^\\"])*
于 2013-05-31T18:55:17.090 回答
1

或者,使用正则表达式,用空字符串替换除引号之外的所有内容,并检查结果的长度。

于 2013-05-31T18:54:44.547 回答
1

不要为此使用正则表达式。只需遍历字符串中的字符并计算"“。它会更有效。这是一个 O(n) 算法。

特别是如果它很简单并且使解决方案比一些晦涩的正则表达式模式更容易阅读。

boolean odd = false;
for(int i=0; i<s.length(); i++) {
  if(s.chartAt(i) == '\"') odd != odd;
}
于 2013-05-31T18:55:23.830 回答
0

您可以使用 split 并检查返回数组中元素的数量是偶数还是奇数,以衡量该字符频率的奇数或偶数

String s = ".. what ever is in your string";
String[] parts = s.split("\"");
if(parts.size()%2){
   //String has odd number of quotes
}else{
   //String has even number of quotes
}
于 2013-05-31T18:56:01.980 回答
0

我不得不说"手动计算 s 的数量可能会更好,但如果你真的想要一个正则表达式,这里应该可以工作:

"(^(([^\"]*\"){2})*[^\"]*$)"

我只是将表达式绑定到字符串的前后,并确保只有一对"s,盲目地吸收它们之间的任何不是 a 的"东西。

于 2013-05-31T19:10:20.653 回答