正则表达式:查找其中包含6个或更少星号的行

时间:2013-11-24 11:38:01

标签: regex

我正在寻找一个正则表达式,可以找到其中包含6个或更少星号的行(行应该有1到6个星号,但不能更多)

例如,它应匹配整行

...this * is * an * example

它不应该匹配此行

**********this is a test ********

我确实有以下RegEx,但它不占用整行,并且对于该行只有一个星号的情况不起作用

(\*.*?\*){1,6}.*

5 个答案:

答案 0 :(得分:1)

以下内容应该有效:

^(?!(?:[^*\r\n]*\*){7})(?=[^*\r\n]*\*).*
  • ^匹配行首。 注意:在常规表达式中启用多行模式,以使^与每行的开头匹配,而不是字符串的开头。
  • (?:[^*\r\n]*\*):匹配零个或多个不是星号[^*]*或回车符\r的字符,也不匹配换行符\n,然后匹配星号*
  • {7,}:匹配前7次或更多次。
  • (?!...):如果之前的模式实际匹配7个或更多星星,则匹配失败。
  • (?=[^*\r\n]*\*):确保该行至少包含一颗星。
  • .*:如果负面展望成功,则匹配整行。

注意:我也更新了演示链接。

Regex101 Demo

答案 1 :(得分:0)

只计算字符串中的星号。在Perl中,这将是

my $number =()= $string =~ /\*/gi;
# or...
$number = ($string =~ tr/\*//);  # only works for single characters..

if ($number <= 6) {
   print "Match:".$string."\n";
}

PHP有substr_count()或preg_match_all()可以完成这项工作。

答案 2 :(得分:0)

根据你的标签投票来判断我猜你正在使用R这对于使用stringr的{​​{1}} pacakge非常容易...

str_count()

使用# Your data x <- c( "...this * is * an * example" , "**********this is a test ********" ) # Load required package require( stringr ) # Count instances of * (note the pattern is a regex so you must escape *) and compare to condition '<= 6' idx <- str_count( x , "\\*" ) <= 6 # [1] TRUE FALSE # Subset data vector x[ idx ] #[1] "...this * is * an * example" gregexpr() ....

计算匹配数的基本R示例
regmatches()

答案 3 :(得分:0)

以下是我写的方式:

/^[^*]*(?:\*[^*]*){1,6}$/

答案 4 :(得分:0)

试试这个,似乎有效:)

^(?=^.*\*.*$)(?!(.*\*){7,}).*$

当然它很贵:(但它是正则表达式:)。