正则表达式,只允许特定的格式。"John-doe"

8
我做了一些研究,但没有找到与我所需完全相关的内容,每次尝试创建表达式时,它总是稍微偏离我需要的内容。
我尝试了类似于[AZaz09]{3,8}\-[AZaz09]{3,8}的东西。
我希望有效结果只允许文本-文本,其中任何一个文本可以是字母或数字,但唯一允许的符号是-,并且在两个文本之间。
每个文本必须至少为三个字符长({3,8}?),然后由-分隔。
因此,为了有效,一些示例可能是:
Text-Text
Abc-123
123-Abc
A2C-def4gk

无效的测试可能包括:

Ab-3
Abc!-ajr4
a-bc3-25aj
a?c-b%

1
您是否希望匹配重音字母或其他字母表?例如:“déjà-vus”, “12µ-13µ”,“mañana-1234”。 - trincot
@trincot:好观点,我已经更新了我的答案以反映u修饰符。 - Jan
6个回答

11

你需要使用锚点并使用-,这样字符类中的字符将被解释为一个范围而不是单个字符。

尝试:


尝试:

^[A-Za-z0-9]{3,8}-[A-Za-z0-9]{3,8}$

演示: https://regex101.com/r/xH3oM8/1

你也可以使用i修饰符和\d元字符来简化它。

(?i)^[a-z\d]{3,8}-[a-z\d]{3,8}$

最上面的看起来对我的使用非常完美 :) - mhvvzmak1
我注意到在该网站的正则表达式末尾有/gm,这个gm是什么意思,是否必需? - mhvvzmak1
2
g 是全局修饰符,m 是多行修饰符。这只是为了演示而已。在 PHP 中不支持 g 修饰符。m 使得 ^$ 匹配每一行,而非整个字符串。 - chris85

6
如果需要允许重音字母或任何存在于Unicode范围内的字母(如希腊或西里尔字母),则使用u修饰符(用于UTF-8支持)和\pL匹配Unicode字母(以及\d匹配数字):
$string ="
Mañana-déjà
Text-Text
Abc-123
123-Abc
A2C-def4gk
Ab-3
Abc!-ajr4
a-bc3-25aj
a?c-b%";

$regex='/^[\pL\d]{3,}-[\pL\d]{3,}$/mu';

preg_match_all($regex, $string, $matches);

var_export($matches);

输出:

array (
  0 => 
  array (
    0 => 'Mañana-déjà',
    1 => 'Text-Text',
    2 => 'Abc-123',
    3 => '123-Abc',
    4 => 'A2C-def4gk',
  ),
)

注意:与\w不同的是,[\pL\d]将不匹配下划线。

5
你可以提出以下内容:

你可以想出如下内容:

<?php
$string ="
Text-Text
Abc-123
123-Abc
A2C-def4gk
Ab-3
Abc!-ajr4
a-bc3-25aj
a?c-b%";

$regex='~
        ^\w{3,}  # at last three word characters at the beginning of the line
        -        # a dash
        \w{3,}$  # three word characters at the end of the line
        ~xm';    # multiline and freespacing mode (for this explanation)
                 # ~xmu for accented characters

preg_match_all($regex, $string, $matches);
print_r($matches);
?>

正如@chris85所指出的那样,\w会匹配下划线。Trincot提供了一个很好的评论(匹配带重音符号的字符)。要实现这一点,只需使用u修改器
请参见regex101.com上的演示ideone.com上的完整代码


PHP不会与其中的解释一起工作,您应该在问题正文中单独处理。 - chris85
@chris85:为什么不呢? - 这正是 x 修饰符的作用。 - Jan
@trincot 从未使用过 x 修饰符,但在这里不起作用,https://eval.in/526650。不过我会研究一下这个修饰符。 - chris85
啊,我现在明白了,那是一个棘手的修饰符,我以前没有遇到过,不能点赞两次。但在另一个环境中仍然无法工作,不确定为什么。 - chris85

3
您可以使用此正则表达式。
^\w{3,}-\w{3,}$

^       // start of the string
\w{3,}  // match "a" to "z", "A" to "Z" and 0 to 9 and requires at least 3 characters
-       // requires "-"
\w{3,}  // same as above
$       // end of the string

正则表达式演示


2

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接