javascript - 我们可以使用正则表达式一次解析多个规则吗?

标签 javascript regex

我需要阻止一些用户输入交互,我的首要任务是立即 regex

我会首先尽可能地写出我需要完成的,然后我会发布我为完成其中大部分而编写的代码,但仍然不完美...

  • 取字符串
  • 不允许它以空格开始输入
  • 不允许连续多个空格
  • 不允许多个连续
  • 不允许多个撇号
  • 允许后面的字符 [a-z] '.
  • 不允许字符串跨越 14 个字符

现在,这是我的代码:

this.name = this.name
  .replace(/^[\s]+/, '')     // prevent starting with space
  .replace(/\s\s+/, ' ')     // prevent multiplace spaces
  .replace(/\.\./, '.')      // prevent multiple dots
  .replace(/''/, '\'')       // prevent multiple apostrophies
  .replace(/[^ a-z'.]/i, '') // allowed
  .toUpperCase()             // transform
  .substring(0, 14)          // do not allow more than 14 characters

问题:

  • 我们能否以及如果可以,如何在单个替换中完成所有这些或大部分这些正则表达式规则?

  • 我如何修复/改进我的正则表达式规则以不允许超过单个 ,我这样做是为了不允许连续输入,但用户可以使用两个点,例如M.G.K - 即使我只想在整个字符串中允许单个 . 条目?

  • 与上面相同,但对于 '(撇号)?

最佳答案

将所有内容“塞进”一个正则表达式替换操作的第一个要求很容易实现,因为您需要做的所有替换都使用您匹配的字符。您可以使用 .replace(/^\s+|(\s)\s+|(\.)\.|(')'|[^ a-z'.]+/ig, '$1$2$3' ),看这个 regex demo .

详情

  • ^\s+ - 字符串开头 (^),然后是 1+ 个空格
  • | - 或者
  • (\s)\s+ - 捕获到第 1 组的单个空格,然后是 1+ 个空格字符
  • | - 或者
  • (\.)\. - . 捕获到第 2 组,然后是 .
  • | - 或者
  • (')' - ' 捕获到第 3 组,然后是 '
  • | - 或者
  • [^ a-z'.]+ - 除了空格、ASCII 字母、'. 之外的 1 个或多个字符。

/i修饰符使a-z以不区分大小写的方式匹配,g启用多重匹配。 $1 引用组 1 中的值,$2 引用组 2 中的值,$3 引用组 3 中的值。请注意,如果它们不匹配,则组中的这些值是空字符串,因此我们可以在单个字符串替换模式中一起使用其中三个。

第二个和第三个要求需要两个单独的正则表达式替换操作。重点是匹配并捕获所有字符,直到第二次出现 '. 并且只匹配第二次出现的 '.,然后替换为对第一组的反向引用:1) .replace(/^([^']*'[^']*)'/, '$1') ( demo ) 和 2) .replace(/^([^.]*\.[^.]*)\./, '$1') ( demo )。

详情

  • ^ - 字符串 anchor 的开始
  • ([^']*'[^']*) - 第 1 组:
    • [^']* - 除了 ' 之外的任何 0+ 个字符([^...] 是否定字符类匹配除类内定义以外的任何字符)
    • ' - 单引号
    • [^']* - 除了 '
    • 之外的任何 0+ 个字符
  • ' - 单引号。

此匹配项替换为 $1,第一个捕获组的内容。

第三个模式类似于第二个部分,只是 ' 被替换为 ./\. (注意在字符类中,. 被视为文字 .,它不匹配任何字符,但匹配 [...] 中的换行字符)。

关于javascript - 我们可以使用正则表达式一次解析多个规则吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46003815/

相关文章:

java - 正则表达式替换除星号和转义星号之外的所有特殊字符

javascript - jQuery Globalize - 必须构建吗?

javascript - 通过每个级别上的单独条件查找匹配的嵌套对象数组

javascript - 使用导航属性创建 Kendo UI 网格模型的问题

javascript - 重复使用clearInterval和clearTimeout不起作用

MySQL正则表达式匹配问题

javascript - 在 ReactJS 中清除 setInterval()

c# - 如何编写正则表达式以在 C# 中使用正则表达式从字符串中获取子字符串?

正则表达式匹配具有以散列开头并以空格结尾的特殊字符的单词

Python 正则表达式?我有麻烦了