如何使用正则表达式来检查一个字符串只包含字母字符[a-z]或[A-Z]?

17 浏览
0 Comments

如何使用正则表达式来检查一个字符串只包含字母字符[a-z]或[A-Z]?

我正在尝试创建一个正则表达式来验证给定的字符串是否只包含字母a-z或A-Z。字符串最多可以有25个字母长(我不确定正则表达式能否检查字符串的长度)。

示例:

1. "abcdef" = true;

2. "a2bdef" = false;

3. "333" = false;

4. "j" = true;

5. "aaaaaaaaaaaaaaaaaaaaaaaaaa" = false; //26个字母

这是我目前的进展...但是我无法弄清楚它的问题所在。

Regex alphaPattern = new Regex("[^a-z]|[^A-Z]");

我认为这意味着字符串只能包含从a到z的大写或小写字母,但当我将其与一个包含所有字母的字符串进行匹配时,它返回false...

另外,关于使用正则表达式与其他验证方法的效率方面的建议将不胜感激。

0
0 Comments

问题的原因是需要一个正则表达式来验证字符串是否只包含字母字符[a-z]或[A-Z]。解决方法是使用以下正则表达式:Regex lettersOnly = new Regex("^[a-zA-Z]{1,25}$");。下面是对正则表达式的解释:

- ^ 表示“从字符串的开头开始匹配”

- [a-zA-Z] 表示“匹配小写和大写字母a到z”

- {1,25} 表示“匹配前面的项(即字符类,参见上面的解释)1到25次”

- $ 表示“只有在光标处于字符串的末尾时才匹配”

此外,还需要设置RegexOptions.MultiLine以明确^和$字符的含义。否则,提供的表达式看起来是完美的。

有人表示不同意这种做法。如果包含了多行选项,它将验证一个包含20个字母、换行符和一堆随机非字母字符的字符串。相反,我建议在使用字符串之前对其进行Trim()处理。

此外,根据"up to 25"的真实含义,1可能需要改为0,因为问题没有明确说明空字符串是否有效。

在这里不需要多行选项;不使用多行选项时,^和$分别表示整个字符串的开头和结尾,这正是所需要的。(*除了$还会在字符串末尾的换行符之前匹配,等等...天哪,我希望我们可以重新开始!)

只需使用\A和\z,所有关于多行的争论也就没有意义了。

0
0 Comments

很容易做到,就像其他人所说的那样,使用字符类(character classes)可以实现。本质上,字符类允许我们指定一个匹配的值范围:

(注意:为了简化,我假设了隐含的^和$锚点,后面的帖子会解释)

[a-z] 匹配任何一个小写字母。

例如:a 匹配,8 不匹配

[A-Z] 匹配任何一个大写字母。

例如:A 匹配,a 不匹配

[0-9] 匹配任何一个数字0到9。

例如:8 匹配,a 不匹配

[aeiou] 只匹配 a 或 e 或 i 或 o 或 u。

例如:o 匹配,z 不匹配

[a-zA-Z] 匹配任何一个小写字母或大写字母。

例如:A 匹配,a 匹配,3 不匹配

这些当然也可以被否定:

[^a-z] 匹配任何不是小写字母的字符。

例如:5 匹配,A 匹配,a 不匹配

[^A-Z] 匹配任何不是大写字母的字符。

例如:5 匹配,A 不匹配,a 匹配

[^0-9] 匹配任何不是数字的字符。

例如:5 不匹配,A 匹配,a 匹配

[^Aa69] 只要不是 A 或 a 或 6 或 9,就匹配任何字符。

例如:5 匹配,A 不匹配,a 不匹配,3 匹配

查看一些常见的字符类,请访问:

http://www.regular-expressions.info/reference.html

字符串最多可以有25个字母。(我不确定正则表达式能否检查字符串的长度)

你绝对可以检查“长度”,但不是以你想象的方式。我们使用{}来衡量重复,而不是严格意义上的长度:

a{2} 匹配两个连续的a。

例如:a 不匹配,aa 匹配,aca 不匹配

4{3} 匹配三个连续的4。

例如:4 不匹配,44 不匹配,444 匹配,4434 不匹配

重复还有可以设置下限和上限的值:

a{2,} 匹配两个或更多个连续的a。

例如:a 不匹配,aa 匹配,aaa 匹配,aba 不匹配,aaaaaaaaa 匹配

a{2,5} 匹配两到五个连续的a。

例如:a 不匹配,aa 匹配,aaa 匹配,aba 不匹配,aaaaaaaaa 不匹配

重复也适用于字符类,所以:

[a-z]{5} 匹配任意五个连续的小写字母。

例如:bubba 匹配,Bubba 不匹配,BUBBA 不匹配,asdjo 匹配

[A-Z]{2,5} 匹配两到五个连续的大写字母。

例如:bubba 不匹配,Bubba 不匹配,BUBBA 匹配,BUBBETTE 不匹配

[0-9]{4,8} 匹配四到八个连续的数字。

例如:bubba 不匹配,15835 匹配,44 不匹配,3456876353456 不匹配

[a3g]{2} 如果出现两次连续的a、3或g,则匹配。

例如:aa 匹配,ba 不匹配,33 匹配,38 不匹配,a3 不匹配

现在让我们看看你的正则表达式:

[^a-z]|[^A-Z]

翻译:匹配任何不是小写字母或大写字母的字符。

为了修复它以满足你的需求,我们会这样重写它:

步骤1:去掉否定

[a-z]|[A-Z]

翻译:找到任何小写字母或大写字母。

步骤2:虽然不是绝对必要,但我们可以稍微整理一下逻辑

[a-zA-Z]

翻译:找到任何小写字母或大写字母。与上面的结果相同,但现在只使用一个[]。

步骤3:现在让我们指示“长度”

[a-zA-Z]{1,25}

翻译:找到任何重复出现一到二十五次的小写字母或大写字母。

这里事情变得有点复杂。你可能认为到这里已经完成了,这取决于你使用的技术。严格来说,正则表达式[a-zA-Z]{1,25}将在一行上匹配一到二十五个大写或小写字母的任意位置:

[a-zA-Z]{1,25}

a 匹配,aZgD 匹配,BUBBA 匹配,243242hello242552 匹配

实际上,我之前给出的所有例子都是如此。如果这就是你想要的,那么你做得很好,但根据你的问题,我猜测你只想在整行上匹配一到二十五个大写或小写字母。为此,我们需要锚点。锚点允许我们指定这些麻烦的细节:

^ 行的开头

(我知道,我们刚刚在否定中使用了它,不要让我开始了)

$ 行的结尾

我们可以这样使用它们:

^a{3} 从行的开头匹配三个连续的a

例如:aaa 匹配,123aaa 不匹配,aaa123 匹配

a{3}$ 在行的结尾匹配三个连续的a

例如:aaa 匹配,123aaa 匹配,aaa123 不匹配

^a{3}$ 在整行上匹配三个连续的a

例如:aaa 匹配,123aaa 不匹配,aaa123 不匹配

请注意,所有情况下aaa都匹配,因为它在行的开头和结尾都有三个a,严格来说。

因此,对于在一行上找到一个“单词”,它的长度为“最多五个字符”,最终的、技术上正确的解决方案将是:

^[a-zA-Z]{1,25}$

“古怪”的部分是,有些技术会为你隐含地添加锚点,而有些则不会。你只需要测试你的正则表达式或阅读文档,看你是否有隐含的锚点。

0
0 Comments

原因:问题的出现是因为需要验证一个字符串是否只包含字母字符[a-z]或[A-Z],并且长度不能超过25个字符。

解决方法:可以使用正则表达式来实现这个验证。下面是一个C#的示例代码:

/// 
/// Checks if string contains only letters a-z and A-Z and should not be more than 25 characters in length
/// 
/// String to be matched
/// True if matches, false otherwise
public static bool IsValidString(string value)
{
    string pattern = @"^[a-zA-Z]{1,25}$";
    return Regex.IsMatch(value, pattern);
}

上述代码中,使用了正则表达式的模式`^[a-zA-Z]{1,25}$`来进行匹配。其中,`^`表示字符串的开头,`[a-zA-Z]`表示匹配任意一个字母字符,`{1,25}`表示匹配1到25个之间的字符,`$`表示字符串的结尾。

函数`IsValidString`接受一个字符串参数`value`,并通过`Regex.IsMatch`方法将`value`与正则表达式模式进行匹配。如果匹配成功,则返回`true`,否则返回`false`。

这样,我们就可以通过调用`IsValidString`方法来验证一个字符串是否只包含字母字符[a-z]或[A-Z],并且长度不超过25个字符。

0