【问题标题】:Regex match count of characters that are separated by non-matching characters由不匹配字符分隔的字符的正则表达式匹配计数
【发布时间】:2013-08-11 06:40:35
【问题描述】:

我想统计字符,但它们可能被不匹配的字符分隔。

这是一个例子。 我想匹配包含 10 个或更多单词字符的文本。它可能包含空格,但我不想计算空格。

应该匹配:“foo bar baz”(应该数 9)
匹配:“a          a”(应计为 2)
应该匹配:“foo baz bar”(应该计数 10,匹配整个字符串)

这是我想出的,但它很重要:

((?<=\s)*\w(?=\s)*){10}

编辑我不想包含用于计数的空格。抱歉,我编辑了几次,我没有正确描述它。

对此有何想法?

【问题讨论】:

  • 那么当有 10 个或更多单词字符时,您是否想要一个 foo,baz,bars 数组?你使用什么语言 - PHP,JS,Perl..?
  • 你说你不想计算空格,然后你“不想匹配它们,只是为了计算它们”。请说清楚。给出示例输入以及所需的匹配和输出。
  • PHP: var_dump(preg_match('#\w{10,}#',str_replace(' ','',$str))); 即删除空格,然后检查
  • 对不起,我原来的问题有点不清楚。我编辑了它。我正在使用 JS 和/或 ruby​​
  • @HansWürstchen 看看我的回答,我想你是在那之后

标签: javascript ruby regex


【解决方案1】:

嘿,我认为这是一个简单但有效的方法:

( *?[0-9a-zA-Z] *?){10,}

分解正则表达式:

  1. ( *? --------It can start with space(s)
  2. [0-9a-zA-Z] -Followed with the alphanumeric values
  3. *?) ---------It can end with space(s)
  4. {10,} -------Matches this pattern 10 or more times

键:当我查看正则表达式的计数时,它适用于组,即括号“()”中的内容,这种情况下,字母数字值后跟空格的多个空格仍被计算在内作为一场比赛。希望能帮助到你。 :)

【讨论】:

  • 有效!谢谢!抱歉回复晚了。我想你可以像这样压缩它:(\s*?[\w]\s*?){10,}
  • @HansWürstchen 同意将[0-9a-zA-Z] 替换为[\w]。但是对于\s" ",我想它会处理更多的事情,这取决于你是从文件中读取(你有多行),还是从某个输入(一行)中获取它,因为 \s 会将 \n 也视为一个字母,但事实并非如此。请查看操作:a 而作为我的:b
  • 在第三个细分中,开头缺少一个空格。它应该看起来像 `*?)` 而不是 *?)。此外,似乎 SO 的反引号中有一个错误......
【解决方案2】:

使用每个单词 char 占用空格的组,并计算组数:

^(\s*\w){10,}\s*$

【讨论】:

  • "超过 10" => {10,} 如果匹配 $,或者只是简化:^(\s*\w){10}。附带说明一下,这些组不必是捕获组:^(?:\s*\w){10}
  • @streetpc 是的,只是注意到了这一点。我已经添加了逗号。好点重新只是放弃$。我想这取决于他是否想在最后防止垃圾。
  • 对不起,我原来的问题有点不清楚。我现在编辑它。我不想计算空格。所以这个字符串不应该匹配 "a" 因为它只有一个匹配的字符。
  • 汉斯,这个正则表达式不会匹配很多空格然后是一个字母。输入的某处必须至少有 10 个字母。
【解决方案3】:

使用JS:去掉空格,然后做\w检查

'foo baz barz'.replace(/ /g,'').match(/\w{10,}/) != null //true
'foo bar baz'.replace(/ /g,'').match(/\w{10,}/) != null //false

匹配文本中的电话号码:

var test = 'something foo baz barz 07999-777-111 and 01234 567890 01234567890 some more'.match(/((\(?0\d{4}\)?[ -]?\d{3}[ -]?\d{3})|(\(?0\d{3}\)?[ -]?\d{3}[ -]?\d{4})|(\(?0\d{2}\)?[ -]?\d{4}[ -]?\d{4}))([ -]?\#(\d{4}|\d{3}))?/g);
//result: ["07999-777-111", "01234 567890", "01234567890"]

【讨论】:

  • 这可能会奏效。一般来说,您会先删除不想匹配的字符,然后进行计数匹配。
  • 嗯,现在我再想一想,我不知道如何选择原始短语。即如果我想用一些东西替换原始文本
  • @HansWürstchen 你的意思是用别的东西替换foo baz barz
  • @HansWürstchen 如果您正在测试整个字符串是否超过 10 个单词字符,那么它只是 if str matches the code above, then str = new_string - 因为这不是测试匹配的子字符串,而是整个字符串。所以整个字符串都被替换了,不需要match() 数据
  • 为了简单起见,我使用了上面的示例。当它只匹配字符串的一部分时,它也应该工作。例如匹配文本中的电话号码,其中电话号码可以用空格和破折号分隔,但必须至少包含 5 位数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多