单个重复一组字符中的某些符号

时间:2014-08-18 00:59:10

标签: regex char

我需要一个匹配包含字母和符号的字符串的正则表达式:@.或空格。但是所有符号必须在整个字符串中只出现一次。

  • ^[@][.][a-z]+$ - 这与example@.asdf匹配,但需要匹配一个@和字符串中的一个点。

  • ^[a-z]+[@][a-z]+[.][a-z]+$ - 这是目前最好的结果。

我只是想知道我是否可以使用类似的东西 - ^[a-z[@]{1}]$

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)
  }
 }
}