Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript正则表达式的困难_Javascript_Regex - Fatal编程技术网

Javascript正则表达式的困难

Javascript正则表达式的困难,javascript,regex,Javascript,Regex,我正在尝试将字符串与以下内容匹配: 以[A-Z] 包含[a-zA-Z-'\u00E0-\u00EF]() 禁止任何其他字符 不以[-']结尾,或使[-']相邻 至少有2个字符 我一直在尝试以下方法: new RegExp(/^[A-Z](?!.*[- ']$).*[a-zA-Z- '\u00E0-\u00EF]$/); 我的问题不是我不能理解正则表达式做什么,而是它们是否正确。 编写一个看起来应该可以工作的正则表达式非常容易(或者不容易),但却忽略了一些事情 任何帮助都将不胜感激 编辑 有

我正在尝试将字符串与以下内容匹配:

  • [A-Z]
  • 包含
    [a-zA-Z-'\u00E0-\u00EF]
    ()
  • 禁止任何其他字符
  • 不以
    [-']
    结尾,或使
    [-']
    相邻
  • 至少有
    2个
    字符
我一直在尝试以下方法:

new RegExp(/^[A-Z](?!.*[- ']$).*[a-zA-Z- '\u00E0-\u00EF]$/);
我的问题不是我不能理解正则表达式做什么,而是它们是否正确。 编写一个看起来应该可以工作的正则表达式非常容易(或者不容易),但却忽略了一些事情

任何帮助都将不胜感激

编辑


有效字符串:
Marie Noëlle Tranchant
Jean-François Copé

测试正则表达式的一个非常基本的方法是使用文本字符串,例如“blah this is text”,并使用.match方法。您可以打开一个js控制台(Chrome中的Ctrl+Shift+J)并直接运行它以查看返回的内容

"Marie-Noëlle Tranchant".match(/^[A-Z][-a-zA-Z '\u00E0-\u00EF]*[^- ']$/);

测试正则表达式的一种非常基本的方法是获取一个文本字符串,例如“blah this is text”,并对其使用.match方法。您可以打开一个js控制台(Chrome中的Ctrl+Shift+J)并直接运行它以查看返回的内容

"Marie-Noëlle Tranchant".match(/^[A-Z][-a-zA-Z '\u00E0-\u00EF]*[^- ']$/);
下面是一个证明,为什么这符合您的标准。如果将非捕获组
(?:…)
更改为
(…)
,则它也是满足条件的最短regexp

以[A-Z]开头

因为
^[A-Z]

包含[a-zA-Z-'\u00E0-\u00EF](拉丁语-1增补-匹配Unicode块范围) 禁止任何其他字符

因为整个内容必须匹配仅包含这些字符的字符集

不以[-']结尾,也不相邻[-']

因为
[-']
被限制为零或每次
[a-zA-Z\u00E0-\u00EF]

至少有2个字符

因为
[A-Z]
至少匹配一个字符,
(?:…)
组后面的
+
需要另一个字符

下面是一个证明,为什么这符合您的标准。如果将非捕获组
(?:…)
更改为
(…)
,则它也是满足条件的最短regexp

以[A-Z]开头

因为
^[A-Z]

包含[a-zA-Z-'\u00E0-\u00EF](拉丁语-1增补-匹配Unicode块范围) 禁止任何其他字符

因为整个内容必须匹配仅包含这些字符的字符集

不以[-']结尾,也不相邻[-']

因为
[-']
被限制为零或每次
[a-zA-Z\u00E0-\u00EF]

至少有2个字符


因为
[A-Z]
至少匹配一个字符,而
(?:…)
组后面的
+
需要另一个字符。

我认为您的regexp不会满足您的要求。它应该接受以
[A-Z]
开头,以
[A-zA-Z\u00E0-\u00EF]
结尾的任何字符串(中间有任何字符,包括您不想接受的字符),尽管我不能确定,因为我不知道如何处理未转义的“-”

我想你想要更像这样的东西:

new RegExp(/^[A-Z](?:(?!--|''|  )[a-zA-Z\- '\u00E0-\u00EF])*[a-zA-Z\u00E0-\u00EF]$/);

我认为你的regexp不会做你想做的事。它应该接受以
[A-Z]
开头,以
[A-zA-Z\u00E0-\u00EF]
结尾的任何字符串(中间有任何字符,包括您不想接受的字符),尽管我不能确定,因为我不知道如何处理未转义的“-”

我想你想要更像这样的东西:

new RegExp(/^[A-Z](?:(?!--|''|  )[a-zA-Z\- '\u00E0-\u00EF])*[a-zA-Z\u00E0-\u00EF]$/);

编辑-重做
在重新访问此帖子后,我注意到以下评论:


“没有[-']相邻”这里的所有9种可能性,或者只有
同一个角色翻了个身jswolf19 2天前

@jswolf19没有:
'space'
--
'
堆栈101 2天前
"

鉴于此,您必须使用@jswolf19所做的

他的正则表达式可以简化一些:

pcre:
/^[A-Z](?:([\-'])(?!$\1)\[A-zA-Z\x{E0}-\x{EF}])+$/

expanded JavaScript:  
^                     # start of string
   [A-Z]                     # single A-Z char
   (?:                       # non-capture group
       ([\- '])                   # capture group 1, single char from: [- ']
       (?! $ | \1 )               # not the end of string nor the
                                  #   char captured in group 1 (backreference)
     |                          # OR,
       [a-zA-Z\u00E0-\u00EF]      # a single char from: [a-zA-Z\u00E0-\u00EF]
   )+                        # end non-capture group, do 1 or more times
$                     # end of string
js:
/^[A-Z](?:([\-'))(?!$\1)[A-zA-Z\u00E0-\u00EF])+$/

expanded JavaScript:  
^                     # start of string
   [A-Z]                     # single A-Z char
   (?:                       # non-capture group
       ([\- '])                   # capture group 1, single char from: [- ']
       (?! $ | \1 )               # not the end of string nor the
                                  #   char captured in group 1 (backreference)
     |                          # OR,
       [a-zA-Z\u00E0-\u00EF]      # a single char from: [a-zA-Z\u00E0-\u00EF]
   )+                        # end non-capture group, do 1 or more times
$                     # end of string
请先测试答案,然后再将其标记为正确答案。其他人可以访问此线程

将来。

编辑-重做 在重新访问此帖子后,我注意到以下评论:


“没有[-']相邻”这里的所有9种可能性,或者只有
同一个角色翻了一倍?-jswolf19 2天前

@jswolf19没有:
“space”“space”
--
'
–2天前的堆栈101
"

鉴于此,您必须使用@jswolf19所做的

他的正则表达式可以简化一些:

pcre:
/^[A-Z](?:([\-'])(?!$\1)\[A-zA-Z\x{E0}-\x{EF}])+$/

expanded JavaScript:  
^                     # start of string
   [A-Z]                     # single A-Z char
   (?:                       # non-capture group
       ([\- '])                   # capture group 1, single char from: [- ']
       (?! $ | \1 )               # not the end of string nor the
                                  #   char captured in group 1 (backreference)
     |                          # OR,
       [a-zA-Z\u00E0-\u00EF]      # a single char from: [a-zA-Z\u00E0-\u00EF]
   )+                        # end non-capture group, do 1 or more times
$                     # end of string
js:
/^[A-Z](?:([\-'))(?!$\1)[A-zA-Z\u00E0-\u00EF])+$/

expanded JavaScript:  
^                     # start of string
   [A-Z]                     # single A-Z char
   (?:                       # non-capture group
       ([\- '])                   # capture group 1, single char from: [- ']
       (?! $ | \1 )               # not the end of string nor the
                                  #   char captured in group 1 (backreference)
     |                          # OR,
       [a-zA-Z\u00E0-\u00EF]      # a single char from: [a-zA-Z\u00E0-\u00EF]
   )+                        # end non-capture group, do 1 or more times
$                     # end of string
请先测试答案,然后再将其标记为正确答案。其他人可以访问此线程

将来

你能举一个有效字符串的例子吗?编辑过的问题-添加了有效字符串。“没有[-']相邻”所有9种可能性都在这里,或者只有同一个字符的三种可能折叠起来?@jswolf19没有:
“space”“space”
--
'
。您能给出一个有效字符串的示例吗?编辑的问题-添加的有效字符串。“没有[-']相邻”这里的所有9种可能性,或者只有同一字符的三种可能性重叠?@jswolf19没有:
“空格”“空格”
--
'
。我的问题是遗漏了几件事:
Ma5rie-N