我需要阻止一些用户输入交互,我的首要任务是立即 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/