我需要一个匹配包含字母和符号的字符串的正则表达式:@
,.
或空格。但是所有符号必须在整个字符串中只出现一次。
^[@][.][a-z]+$
- 这与example@.asdf
匹配,但需要匹配一个@
和字符串中的一个点。
^[a-z]+[@][a-z]+[.][a-z]+$
- 这是目前最好的结果。
我只是想知道我是否可以使用类似的东西 - ^[a-z[@]{1}]$
。
答案 0 :(得分:0)
你可能已经意识到你可以通过编写3个符号的所有6个排列来逃避它。不幸的是,这是你用普通正则表达式做的最好的,因为根据定义,regexp(被视为有限状态自动机)的唯一方法是能够记住之前发生的事情是通过它们的当前状态,你不能有一套存储你的东西到目前为止看到了。
所以你必须做这样的事情。 说\ a代表字母(你可以将它扩展为[a-zA-Z]),因为它就像那样糟糕。你可以使用
\a*([@]?\a*[.]?\a*[ ]?|[@]?\a*[ ]?\a*[.]?|[.]?\a*[@]?\a*[ ]?|[.]?\a*[ ]?\a*[@]?|[ ]?\a*[.]\a*[@]|[.]?\a*[ ]\a*[@]|)\a*
我在charactacters之后扔了问号,所以每次都可以出现“最多”一次,如果你只想丢掉所有问号那么。
显然,如果你正在处理10个符号而你必须写10个!排列你最好写一个像
这样的函数fun check_string_contains_symbols_once_at_most(str) {
for c in str {
if symbol_list.contains(c) {
if symbol_seen_set.contains(c) then return false
else if symbol_seen_set.add(c)
}
}
}