1

我需要检查一个由许多单词/字母/等组成的字符串,是否只包含一组三重双引号(即“””),但也可以包含单双引号(“)和双双引号( ""),使用正则表达式。到目前为止还没有取得太大的成功。

4

5 回答 5

1

尝试使用出现次数运算符来精确匹配三个双引号。

  • \"{3}
  • ["]{3}
  • [\"]{3}

我已经使用http://www.regextester.com/快速检查过,似乎工作正常。

但是,您如何以您选择的语言正确编译正则表达式可能会有所不同!

于 2009-09-29T21:05:25.410 回答
1

带有负前瞻的正则表达式可以做到这一点:

(?!.*"{3}.*"{3}).*"{3}.*

我用这些java代码行尝试了它:

String good = "hello \"\"\" hello \"\" hello ";
String bad = "hello \"\"\" hello \"\"\" hello ";
String regex = "(?!.*\"{3}.*\"{3}).*\"{3}.*";
System.out.println( good.matches( regex ) );
System.out.println( bad.matches( regex ) );

...带输出:

true
false
于 2009-09-29T22:31:00.613 回答
0

取决于您的语言,但您应该只需要匹配三个双引号(例如,/\"{3}/),然后计算匹配项以查看是否恰好有一个。

于 2009-09-29T21:05:15.987 回答
0

可能有很多方法可以做到这一点,但一种简单的方法是仅查找多次出现的三引号,然后反转正则表达式。下面是 Perl 的一个例子:

use strict;
use warnings;

my $match = 'hello """ hello "" hello';
my $no_match = 'hello """ hello """ hello';
my $regex = '[\"]{3}.*?[\"]{3}';

if ($match !~ /$regex/) {
    print "Matched as it should!\n";
}
if ($no_match !~ /$regex/) {
    print "You shouldn't see this!\n";
}

哪个输出:

Matched as it should!

基本上,您是在告诉它找到您不想要的东西,然后颠倒事实。希望这是有道理的。如果您需要帮助,可以帮助您将示例转换为另一种语言。

于 2009-09-29T21:41:10.140 回答
0

这对你来说可能是一个好的开始。

^(\"([^\"\n\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*\"|'([^'\n\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*'|\"\"\"((?!\"\"\")[^\\]|\\[abfnrtv?\"'\\0-7]|\\x[0-9a-fA-F])*\"\"\")$

regex101.com上查看它的实际应用。

于 2019-04-22T16:47:43.590 回答