2017-02-13 45 views
1

我有这个表达式:正则表达式的开始和结束的信,让逗号和破折号

/^[\a-zøåæäöüß][\a-z0-9øåæäöüß]*(?:\-?[\a-z0-9øåæäöüß,]+)*$/i

它工作正常的像"K61-283øÅ,æk-ken,a-sd"疯狂投入,但对案件"word,"失败(所以,当只有一个逗号时)。

另外 - 我怎么能限制它,它应该在每个逗号或破折号(基本上 - 每个单词)后以字母开头?

规则是:以字母开头并以字母数字结尾;允许字母数字,破折号和逗号;每一划线后或逗号应该有一个字母

+0

你确定你没有允许'_'?那么'\ w'是做什么的?你的模式要求是什么? –

+0

哦,我明白了......我以为'\ w'只允许使用字母数字... – Milkncookiez

+0

好的,试试[/^[a-zøåæäöüß] [a-z0-9øåæäöüß] *(?:[ - ,] [a -z0-9øåæäöüß] +)* $/i'(https://regex101.com/r/RQhsOy/1)。注意我从'[ - ,]' –

回答

1

您可以使用

/^[a-zøåæäöüß][a-z0-9øåæäöüß]*(?:[-,][a-zøåæäöüß][a-z0-9øåæäöüß]*)*$/i 

regex demo

详细

  • ^ - 串
  • 开始
  • [a-zøåæäöüß] - 从定义的信中
  • [a-z0-9øåæäöüß]* - 0+数字或字母从定义设置
  • (?:[-,][a-zøåæäöüß][a-z0-9øåæäöüß]*)* - 零次或多次的序列:
    • [-,] - 一个-,
    • [a-zøåæäöüß] - 一个从所定义的字母设定
    • [a-z0-9øåæäöüß]* - 0+数字或字母从所定义的设置
  • $ - 字符串的结尾。
+0

这允许'a0'(这是无效的)但不允许'a'(这是有效的)。 – melpomene

+0

@melpomene:为什么'a0'无效?顺便说一下,'a' [是匹配的](https://regex101.com/r/RQhsOy/4)。 –

+0

'a0'被“*开头和结尾是一个字母*”(它以一个数字结尾)排除。 'a'是有效的,因为它是一个以字母开头和结尾的字符串。 – melpomene

1

更新2:

有看你的需求两个方面。

  1. 自上而下的视图

    我们把输入的一个或多个单词的列表,用逗号或破折号分开:

    INPUT = WORD (?: [,\-] WORD)* 
    

    每个字由一个字母,后面由零个或多个字母或数字组成:

    WORD = LETTER [ LETTER DIGIT ]* 
    

    翻译成JavaScript正则表达式语法,这给了我们:

    WORD = [a-zøåæäöüß][a-zøåæäöüß\d]* 
    

    和整个输入(带锚):

    /^[a-zøåæäöüß][a-zøåæäöüß\d]*(?:[,\-][a-zøåæäöüß][a-zøåæäöüß\d]*)*$/i 
    

    (这是Wiktor的Stribiżew的答案)

  2. 自下而上的观点

    我们开始看在允许的字符处。我们知道第一个字符必须是一个字母。在此之后,可以有零个或多个输入元素:

    INPUT = LETTER ELEMENT* 
    

    每个元素都是

    • 字母或数字,或
    • 逗号或破折号,随后是字母:

    ELEMENT = [ LETTER DIGIT ] | [ COMMA DASH ] LETTER 
    

    这个翻译成JavaScript给了我们:

    /^[a-zøåæäöüß](?:[a-zøåæäöüß\d]|[,\-][a-zøåæäöüß])*$/i 
    

这两个正则表达式是等效的。自下而上的正则表达式更短,包含更少的重复代码。另一方面,如果输入的字符串大部分是字母数字的,并且相对较少的破折号/逗号,则自顶向下的正则表达式在某些正则表达式引擎上可能运行得更快。在抓握的手上,如果你的输入很短,你可能不会在意微小的性能差异。


这里是您(修订)要求直接编码:

/^[a-zøåæäöüß](?:(?:[a-zøåæäöüß\d]|[,\-][a-zøåæäöüß])*[,\-]?[a-zøåæäöüß])?$/i 

的想法是一致的一封信,之后无论是

  • 字符串的结束(这处理长度为1)的输入字符串,或
  • 0个或多个中间体的列表,可选后跟逗号或短划线,后跟另一个字母

每个中间要么是

  • 字母或
  • 数字或
  • 逗号或破折号后跟字母
+0

除了在''asd,-asd“'失败。 – Milkncookiez

+1

@Milkncookiez我已经完全重写了我的答案。 – melpomene

+0

我想我欠你一笔。 –

-1

尝试了这一点:(允许字母和数字逗号或破折号后)

/^[a-zøåæäöüß]([a-z0-9øåæäöüß]|(,|-)[a-z0-9øåæäöüß])*[a-zøåæäöüß]$/i 

或这样的:(允许字母逗号或破折号后)

/^[a-zøåæäöüß]([a-z0-9øåæäöüß]|(,|-)[a-zøåæäöüß])*[a-zøåæäöüß]$/i 
+0

你不必逃避','或'-'。你的正则表达式不允许'a'(这是有效的),但是它们允许'a,0a'(这是无效的)。 – melpomene

+0

'a,a'是您的正则表达式不匹配的另一个有效输入。 – melpomene

相关问题