【问题标题】:Regex filter excludes ":" and includes at least one word character正则表达式过滤器排除“:”并包含至少一个单词字符
【发布时间】:2022-01-08 22:35:02
【问题描述】:

如果一个包含 :,任务是排除价值。该值还必须包含至少 1 个单词字符。

匹配的字符串值为:

'   h-73 \r\n\t'
'   hey'
'hi  '
'7'

不匹配的值是:

'    \r\n\t' // neither letter not digit
'    ' // neither letter not digit
'  sds:  \r\n\t' // :

要排除我会使用/^[^:]+$/ 来过滤我会使用/\w+/ 的单词字符。

我不知道如何在同一个正则表达式中一起使用它们,因为每个条件的范围应该是整个字符串。

【问题讨论】:

  • 为什么不使用两个正则表达式而不是一个,并使用&& 组合结果?并且“包括:”甚至可以在没有正则表达式的情况下完成。
  • "' \m\n\t' // 既不是字母也不是数字" - m 呢,那不是字母吗? \m 不是任何特殊字符的转义序列,而只是字符反斜杠和 m。
  • 这是一个错字(现已修复),OP 在所有示例中都使用\r\n\t 来显示空格的使用情况。

标签: javascript regex typescript


【解决方案1】:

符合您的规范的正则表达式是

/^[^\w:]*\w[^:]*$/

详情

  • ^ - 字符串开头
  • [^\w:]* - 除了 word 和 : 字符之外的零个或多个字符
  • \w - 一字字符
  • [^:]* - 任何字符,零次或多次出现,冒号除外
  • $ - 字符串结束。

JavaScript 演示:

const texts = ['   h-73 \r\n\t','   hey','hi  ','7','    \r\n\t','    ','  sds:  \r\n\t'];
const re  = /^[^\w:]*\w[^:]*$/;
for (const text of texts) {
    console.log("'"+text+"'", '=>', re.test(text));
}

注意:你也可以使用/^[^:]*\w[^:]*$/,但是这个正则表达式会尽可能多地从字符串的开头抓取非冒号,然后回溯到一个单词char,它更少高效的。所以,欢迎第一个否定字符类中的\w

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    相关资源
    最近更新 更多