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

dvl*_*den 4 javascript regex

我需要阻止一些用户输入交互,我最关心的是regex立即。

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

  • 取字符串
  • 不要让它开始打字 space
  • 不允许多个spaces连续
  • 不允许多个dots连续
  • 不允许多个 apostrophies
  • 允许以下字符 [a-z] '.
  • 不允许字符串交叉 14 characters

现在,这是我的代码:

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
Run Code Online (Sandbox Code Playgroud)

问题:

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

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

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

Wik*_*żew 5

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

细节

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

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

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

细节

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

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

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