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
输入 - 同上,但适用于“
(撇号)”
.replace(/^\s+|(\s)\s+|(\.)。|(')'.[^a-z'.]+/ig,$1$2$3')
,请参见此
详细信息
-字符串(^\s+
)的开头,然后是1+空格^
-或|
-将单个空格捕获到组1中,然后捕获1+个空格字符(\s)\s+
-或|
-a(\)\。
捕获到组2中,然后a
-或|
-将一个(“)”
捕获到组3中,然后捕获一个“
”
-或|
-1个或多个字符,而不是空格、ASCII字母、[^a-z.]+
和'
/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好的,我会在沙坑之外添加一个。:)