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

Javascript 我们可以使用正则表达式一次解析多个规则吗?,javascript,regex,Javascript,Regex,我需要防止一些用户输入交互,我最想做的就是立即执行regex 我将首先尽我所能地编写我需要完成的内容,然后我将发布我为完成其中大部分内容而编写的代码,但仍然不完美 拿绳子 不允许它以空格开始键入 不允许连续使用多个空格 不允许连续出现多个点 不允许多个撇号 允许以下字符[a-z]'。 不允许字符串跨越14个字符 现在,这是我的代码: this.name = this.name .replace(/^[\s]+/, '') // prevent starting with spa

我需要防止一些用户输入交互,我最想做的就是立即执行
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
    ——即使我只允许整个字符串中的单个
    输入

  • 同上,但适用于“
    (撇号)

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

详细信息

  • ^\s+
    -字符串(
    ^
    )的开头,然后是1+空格
  • |
    -或
  • (\s)\s+
    -将单个空格捕获到组1中,然后捕获1+个空格字符
  • |
    -或
  • (\)\。
    -a
    捕获到组2中,然后a
  • |
    -或
  • (“)”
    -将一个
    捕获到组3中,然后捕获一个
  • |
    -或
  • [^a-z.]+
    -1个或多个字符,而不是空格、ASCII字母、
    '
/i
修饰符以不区分大小写的方式进行
a-z
匹配,
g
启用多个匹配。
$1
指组1中的值,
$2
指组2中的值,
$3
指组3中的值。请注意,如果它们不匹配,组中的这些值是空字符串,因此我们可以在单个字符串替换模式中同时使用其中三个值

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

详细信息

  • ^
    -字符串锚的开始
  • ([^']*'[^']*)
    -第1组:
    • [^']*
      -除
      '
      以外的任何0+字符(a
      [^…]
      是一个与类内定义的字符以外的任何字符相匹配的否定字符类)
    • -单引号
    • [^']*
      -除
      '
  • -一个单引号
此匹配将替换为第一个捕获组的内容
$1


第三种模式与第二种模式类似,只是将
替换为
/
\。
(请注意,在字符类中,
被视为文本
,它不匹配任何字符,但与
[…]
中的换行字符匹配。

请尝试
s.replace(/^\s++.s++.s++|[^a-z'.\n]+/g,'$1$2$3'.toUpperCase().substring(0,14)
,但最后2点不在一次性JS正则表达式的范围内。@WiktorStribiżew怪异,但当我开始键入时,它允许我键入单个字母,然后它会删除所有内容。我建议可读性优于将一堆规则塞进一起。稍后当你试图找出为什么它不起作用,并且你有一个非常复杂的正则表达式时这将很难。如果你有几行很好的注释,这将很容易。我怀疑性能不会有太大的不同。@sniperd很感谢你提供的信息。不过,很高兴从Wiktor的示例中通过
|
可以做到这一点。然而,我仍然需要一些帮助来改进和学习如何改进我的正则表达式规则,就像它们一样我没有真正实现我想要实现的目标,我做了一些输入错误。您需要另外两个正则表达式替换来实现最后两个要求。类似于
。replace(//^([^']*'[^']*'[^']*')/,'$1')。replace(//^([^.]*\.[^.]*)\./,'$1'))
非常感谢您提供的解决方案、解释和演示。一切都按预期进行。事实上,如果您共享您的小提琴,它会更好:)啊,我没有使用JSFIDLE进行此操作,即使是我通常使用的操作。这是直接深入到项目中。@dvLden好的,我会在沙坑之外添加一个。:)