正则表达式逐行:如何匹配三引号但不匹配双引号
题
我需要检查一个由许多单词/字母/等组成的字符串是否只包含一组三重双引号(即"""),但也可以使用正则表达式包含单双引号 (") 和双双引号 ("")。到目前为止还没有取得太大成功。
解决方案
具有负先行甲正则表达式可以做到这一点:
(?!.*"{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
其他提示
尝试使用出现次数运算符来精确匹配三个双引号。
- \"{3}
- ["]{3}
- [\"]{3}
我很快就使用了检查 http://www.regextester.com/, ,似乎工作正常。
不过,如何用您选择的语言正确编译正则表达式可能会有所不同!
取决于你的语言,但你应该只需要符合三个双引号(例如,/\"{3}/
),然后算比赛,看是否恰好有一个。
有可能很多方法可以做到这一点,但一个简单的一种是仅仅寻找三重引号的多次出现,然后反转正则表达式。下面是在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!
基本上,你告诉它找到你不想要的东西,然后反转的真相。希望是有道理的。可以帮助您的例子转换为另一种语言,如果你需要帮助。
这可能是一个良好的开端给你。
^(\"([^\"\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 。
不隶属于 StackOverflow