我需要阻止一些用户输入互动,并且我立即想到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
问题:
我们可以以及如何在单次替换中完成所有这些或大部分正则表达式规则吗?
如何修复/改进我的正则表达式规则以允许不超过单.
,我这样做是为了不允许连续输入,但用户可以使用两个点,如{{1 - 甚至我想在整个字符串中只允许单个M.G.K
条目?
与上述相同,但适用于.
(撇号)?
答案 0 :(得分:3)
将所有内容“塞入”1个正则表达式替换操作的第一个要求相当容易实现,因为您需要做的所有替换都是使用您匹配的字符。您可以使用.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)。
<强>详情
^
- 字符串锚的开始([^']*'[^']*)
- 第1组:
[^']*
- 除'
以外的任何0 +字符(a [^...]
是一个否定的字符类,它匹配除类中定义的字符以外的任何字符)'
- 单引号[^']*
- 除'
'
- 单引号。此匹配将替换为$1
,即第一个捕获组的内容。
第三种模式类似于第二种模式,只有'
被.
/ \.
取代(请注意,在字符类中,.
被视为文字.
,它与[...]
}内的任何字符匹配但不包括换行符。