【问题标题】:Regular expression to allow only one special character?正则表达式只允许一个特殊字符?
【发布时间】:2014-08-13 10:21:07
【问题描述】:

我正在尝试为在输入中只允许使用撇号、破折号和句号的名称添加验证。

我尝试使用以下表达式:

name= /^[a-zA-Z-,]+(\-\.\'\s{0,1}[a-zA-Z-, ])*$/

但这些值只接受字母后的一个字符。
如何指定在正则表达式中只允许出现一次的字符。
我的表达有什么错误?

编辑:

^[-'.a-zA-Z0-9][a-zA-ZÀ-ÿ\-\.\'\s|]{0,25}$

但这允许特殊字符允许多次。

【问题讨论】:

  • 问题已被标记为 C#,但您似乎使用的是 javascript 语法?另外,请发布示例文本。
  • 特殊字符都是可选的吗?
  • - 在字符类中应该被转义或在[...] 内的开始/结束中
  • 相当愚蠢的要求...
  • 可怜的 Anne-Marie Smith-Bloggs..

标签: c# regex validation


【解决方案1】:

我正在尝试为在输入中只允许使用撇号、破折号和句号的名称添加验证。

您可以使用这个基于前瞻的正则表达式:

^(?=[a-zA-Z,]*['.-][a-zA-Z,]*$)[a-zA-Z,'.-]+$

RegEx Demo

这里的(?=.*?['.-][^'.-]*$) 是一个前瞻,确保在输入中只允许一个撇号或破折号或句点。

【讨论】:

  • 为什么不单独使用前瞻,将.[^'.-] 替换为[a-zA-Z]
  • @Rawling:当然[^'.-]也可以替换为[a-zA-Z,]
  • 事实上,如果不这样做,这会被破坏,因为.* 允许多个特殊字符,尽管?
  • 仍然效率低下。前瞻可以用作整个表达式。
  • @Rawling:对于这个前瞻,你建议的正则表达式是什么?
【解决方案2】:

使用可选的量词?

^[a-zA-Z-,]*[-.'\sÀ-ÿ|]?[a-zA-Z-,]*$

这是UPDATED regex demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    相关资源
    最近更新 更多