【问题标题】:How to allow only 3 types of characters between words?如何在单词之间只允许 3 种类型的字符?
【发布时间】:2020-03-17 10:15:30
【问题描述】:

我有一组允许的字符:

  1. 撇号`

  2. 空白空间

  3. 破折号-

我正在努力构建一个正则表达式:

一个。每个单词之间只允许出现一次允许的字符(允许任意数量的单词)

E.g.
text-text    --> VALID
text text    --> VALID
text`text    --> VALID

b.允许允许的字符组合,但不能一个接一个

E.g.
text-text`text    --> VALID
text text-text    --> VALID
text`text text    --> VALID
text``text  text  --> INVALID
text`text  text   --> INVALID
text`text -text   --> INVALID

c。不允许以空格 撇号 ` 或破折号 - 开头,并且不允许以撇号 ` 或破折号 - 结尾,但可以以 [emptyspace] 结尾

E.g.
text[emptyspace]  --> VALID
[emptyspace]text  --> INVALID
`text             --> INVALID
text`             --> INVALID
-text             --> INVALID
text-             --> INVALID

d。根本不允许使用特殊字符

e。根本不允许使用数字

这是我目前所拥有的:https://regex101.com/r/9i3vq2/5

【问题讨论】:

    标签: regex regex-group


    【解决方案1】:

    你可以使用

    ^[a-zA-Z]+(?:[ `-][a-zA-Z]+)* ?$
    

    regex demo

    详情

    • ^ - 字符串开头
    • [a-zA-Z]+ - 1+ ASCII 字母
    • (?:[ `-][a-zA-Z]+)* - 0 次或多次重复
      • [ `-] - 空格、反引号或-
      • [a-zA-Z]+ - 1+ ASCII 字母
    • ? - 可选空格
    • $ - 字符串结束。

    【讨论】:

    • 这个正则表达式是否存在否定?我还需要一个否定版本,因为我必须自动更正无效的字符串
    • @AndreicaBogdan 你不能轻易地“否定”任何正则表达式,因为“否定”有很多含义。现在,甚至不清楚您要自动更正什么。无论如何,这是一个新问题。
    • 我明白了。我认为可以添加简单的否定来反转上述标准。什么是有效的,什么是无效的。
    【解决方案2】:

    我会简化 Wiktor 对下一个正则表达式的回答:

    ^[a-zA-Z]+([ `-][a-zA-Z]+)* ?$
    

    https://regex101.com/r/8wTpUv/1

    【讨论】:

    • 您并没有简化,而是给引擎施加了更多压力,并生成了使用捕获组不需要的捕获。
    猜你喜欢
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 2019-08-16
    • 2015-11-02
    • 2011-06-21
    • 1970-01-01
    相关资源
    最近更新 更多