我有一个正则表达式来匹配一个人的名字.
到目前为止我有^([a-zA-Z \'\ s] +)$但是id喜欢添加一个检查以允许最多4个空格.我如何修改它来做到这一点?
编辑:我的意思是在字符串中的任何地方有4个空格
pip*_*eek 11
不要尝试正则表达式验证名称.人们可以随心所欲地打电话给自己.这可以包括任何字符.仅仅因为你住在只使用英语的地方并不意味着所有使用你系统的人都会有英文名字.我们甚至不得不在我们的系统Unicode中创建名称字段.它是数据库中唯一的Unicode类型.
如果您在意,我们实际上将名称拆分为""并将每个名称部分存储为单独的记录,但我们有一些非常具体的要求,这意味着这是一个好主意.
PS.我妈妈的名字中有5个空格.
^ # Start of string
(?!\S*(?:\s\S*){5}) # Negative look-ahead for five spaces.
([a-zA-Z\'\s]+)$ # Original regex
Run Code Online (Sandbox Code Playgroud)
或者在一行中:
^(?!(?:\S*\s){5})([a-zA-Z\'\s]+)$
Run Code Online (Sandbox Code Playgroud)
如果字符串中有五个或更多空格,则五个将与否定前瞻匹配,并且整个匹配将失败.如果有四个或更少,原始正则表达式将匹配.
在这里使用正则表达式似乎正在为解决方案创建问题,而不仅仅是解决问题.
对于一个新手程序员来说,这个任务应该是"容易的",正则表达式的新想法已经污染了我们的思想!
1: Get Input
2: Trim White Space
3: If this makes sence, trim out any 'bad' characters.
4: Use the "split" utility provided by your language to break it into words
5: Return the first 5 Words.
Run Code Online (Sandbox Code Playgroud)
火箭科学.
什么意思搞砸正则表达式?你显然是VB程序员.正则表达式是使用字符串的最有效方法.学习它们.
不,Php,玩弄了一点红宝石,现在变成了perl.
有一些东西(比如这种情况),基于正则表达式的替代方案在计算上和逻辑上指数过于复杂.
我用正则表达式解析整个php源文件,我不是他们使用的新手.
但是有很多情况,比如这个,你雇用一家伐木公司修剪你的玫瑰丛.
我当然可以使用正则表达式完成所有步骤2到5,但它们将是简单的原子正则表达式,没有奇怪的回溯语法或递归搜索的可能性.
我在上面列出的步骤1到5具有已知的范围,已知的输入范围,并且它的功能没有模糊性.关于你的正则表达式,你必须得到别人的贡献才能写出如此简单的事实证明了这一点.
我看到有人认为我的帖子很冒犯,我有些不高兴我不能说这个事实对我很冒犯.;)
布丁证明:
sub getNames{
my @args = @_;
my $text = shift @args;
my $num = shift @args;
# Trim Whitespace from Head/End
$text =~ s/^\s*//;
$text =~ s/\s*$//;
# Trim Bad Characters (??)
$text =~ s/[^a-zA-Z\'\s]//g;
# Tokenise By Space
my @words = split( /\s+/, $text );
#return 0..n
return @words[ 0 .. $num - 1 ];
} ## end sub getNames
print join ",", getNames " Hello world this is a good test", 5;
>> Hello,world,this,is,a
Run Code Online (Sandbox Code Playgroud)
如果对任何人有什么模糊不清的话,我会很乐意向他们解释.注意到我还在使用regexp.其他语言我会尽可能使用他们原生的"修剪"功能.
我第一次尝试这种方法.这是关于正则表达式的大脑.孩子们,不要做正则表达式.
这可能是一个好的开始
/([^\s]+
(\s[^\s]+
(\s[^\s]+
(\s[^\s]+
(\s[^\s]+|)
|)
|)
|)
)/
Run Code Online (Sandbox Code Playgroud)
(为了清晰起见,使用Linebroken)
/([^\s]+(\s[^\s]+(\s[^\s]+(\s[^\s]+|)|)|))/
Run Code Online (Sandbox Code Playgroud)
(实际)
我已经[^\s]+在这里用而不是你的AZ组合来表示succintness,但重点在于嵌套的可选组
即:
(Hello( this( is( example))))
(Hello( this( is( example( two)))))
(Hello( this( is( better( example))))) three
(Hello( this( is()))))
(Hello( this()))
(Hello())
Run Code Online (Sandbox Code Playgroud)
(注意:这虽然令人费解,但它的好处是它会将每个名称与自己的组相匹配)
如果你想要可读的代码:
$word = '[^\s]+';
$regex = "/($word(\s$word(\s$word(\s$word(\s$word|)|)|)|)|)/";
Run Code Online (Sandbox Code Playgroud)
(它固定在"捕获|"的口头禅"得到这个,或什么也得不到")