我在表达正则表达式时遇到了困难。
唯一的要求是,如果单词中有一个点(。),则点的两边必须有一个字母。单词中可以有任意数量的点,点之间可以有任意数量的字母。只需要在点的两边都有一个字母。
我有很多想法,但我遇到的问题是只用一个字母分隔的点(见下面的例子)
目前我有这样的表达:
^(\s*[0-9A-Za-z]{1,}[.]{0,1}[0-9A-Za-z]{1,}\s*)+$
这适用于以下内容:
但是,如果点只用一个字母分隔,则不适用于单词,如下所示:
任何人都知道如何解决这个问题?
编辑:
下面的BHustus解决方案是更好的解决方案。
然而,我确实采取了BHustus所展示的内容,并将其与我之前所拥有的内容相结合,以提出一个更少"令人困惑的"模式以防万一其他人感兴趣。
^(\s*[\d\w]+([.]?[\d\w]+)+\s*)+$
关键是拥有。并且在其自己的组中的1个单词并重复。 ([。] [\ d \ W] +)+
感谢。
答案 0 :(得分:2)
([\w]+\.)+[\w]+(?=[\s]|$)
解释:
括号中的第一组匹配一个或多个字母或数字(\w
是[A-Za-z0-9]
的简写,+
表示“匹配前一次或多次”,速记对于{1,}
),后跟一个句号。在匹配一个或多个[\w]+\.
周期后,最终[\w]+
确保最后至少有一个字母并消耗所有字符,直到达到非字符。最后,(?=[\s]|$)
是一个先行断言,确保前面有空格([\s]
),或字符串末尾($
)(|
为{正则表达式“或”字符)。如果前瞻失败,则不匹配。
Online demo,显示所有测试用例
答案 1 :(得分:0)
你必须使用正则表达式吗?接受的答案的正则表达式很难阅读。一个简单的循环怎么样?
for(int i = 0; i < str.length; i++)
{
char ch = str[i];
if(ch == '.')
{
if(i == 0) return false; //no dots at start of string
if(i == str.length - 1) return false; //no dots at end of string
if(str[i + 1] == '.') return false; //no consecutive dots
}
else if(!IsLetter(ch) && !IsNumber(ch))
{
return false; //allow only letters and numbers
}
}
return true;