正则表达式-允许在字符串中间而不是末尾使用period('。')

时间:2018-07-16 18:40:14

标签: regex

我正在使用正则表达式根据条件允许和拒绝字符串-

The expression used-
^([\w\.,'()@&-]|\s)*$

Allows-

exmple_
example(ggg)
exam.pl56e
exam.pl56e.hbhbh.
exampleghh. vgvj
example (bb)ste kklk ae
_example_

当前,它允许在字符串的中间和结尾添加句点。

如果只是在字符串的末尾添加句点,我只是想拒绝字符串,但允许使用上述正则表达式将其添加到中间

For example, reject-

Test.test1.
Example.
Test Test.
test@example.
exam.pl56e.hbhbh.

4 个答案:

答案 0 :(得分:1)

您可以在模式中使用单个字符类(将\s与先前的字符类合并)以简化模式,并且可以使用其中任何一个

^([\w.,'()@&\s-]*[\w,'()@&\s-])?$

请参见regex demo

详细信息

  • ^-字符串的开头
  • ([\w.,'()@&\s-]*[\w,'()@&\s-])?-一个可选序列(如果要匹配至少1个字符,请删除()?):
    • [\w.,'()@&\s-]*-0+个单词,.,'()@,{ {1}},空格或连字符
    • &-一个单词,[\w,'()@&\s-],'()@,空格或连字符(但没有&!)
  • .-字符串结尾

或者是回溯版本:

$

它匹配仅由字符类内的字符组成的字符串,并且在匹配字符串的末尾后,lookbehind检查最后一个字符是否为点。如果是,则匹配失败。

或者,先行

^[\w.,'()@&\s-]*$(?<!\.)

在这里,^(?!.*\.$)[\w.,'()@&\s-]*$ 检查字符串是否在任何0+字符后以(?!.*\.$)结尾,如果匹配,则不返回任何匹配项。否则,字符串与.模式匹配。

答案 1 :(得分:0)

只需指定最后一个字符不能为句点即可。

sendFriendRequest.setEnabled(false);

答案 2 :(得分:0)

我学到的一个不错的技巧是将某些原本允许使用的表达式列入黑名单,方法是将它们自己放在匹配项之前以无匹配的交替出现。

# sentences containing `foo` or `bar` but not the word `foobar`
^.*foobar.*$|(^.*foo.*$)|(^.*bar.*$)

这确实有点... 冗长在这里:

^(?:[\w\.,'()@&-]|\s)*\.$|^([\w\.,'()@&-]|\s)*$

所以最好在后面使用负向后看

^([\w\.,'()@&-]|\s)*$(?<!\.)

答案 3 :(得分:0)

您可以使用否定的前行(?!来断言,后面不是字符类中的字符重复了零次或多次,并以字符串末尾的点结束。

^(?![\w\.,'()@&\s-]*\.$)[\w\.,'()@&\s-]*$

请注意,使用星号*会匹配零次或多次。