限制输入数据

时间:2013-06-04 12:56:56

标签: regex boost-regex

我是正则表达式的新手。我一直在阅读有关正则表达式的最后几个小时,以了解如何使用正则表达式*来实现以下目标,但运气不佳。我的大脑开始受伤了。因此,这需要帮助。以下是我想要应用于数据输入字段的限制,我应该使用什么正则表达式?

  1. 第一个和最后一个字符应为字母数字,“。” (即点)或“_”(即下划线)
  2. 第一个和最后一个角色之间的字符可以是字母数字,“。” (即点),“_”(即下划线)或“ - ”(即连字符)
  3. 字符“。” (即点)和“ - ”(即连字符)不能连续出现。
  4. 输入中应至少包含一个字母数字字符。
  5. 一些有效的输入数据:

    .abc_
    __abc.d-e.
    .__a.
    .a__b.
    _a-b.
    abc
    a___.
    

    谢谢和问候,

    〜插头

    • 我正在使用第三方库,内部使用boost-regex来解析表达式。

3 个答案:

答案 0 :(得分:2)

你应该真正展示你到目前为止所展示的内容。

那就是说,覆盖你的限制的正则表达式应该看起来像这样:

^[a-zA-Z0-9\._](?:[a-zA-Z0-9_]*(?:\.(?!\.))*(?:-(?!-))*[a-zA-Z0-9_]*)*[a-zA-Z0-9\._]$

有人可能会使用更好的格式化版本,但它似乎可以在http://www.regex101.com/中用于我测试过的所有内容。

答案 1 :(得分:2)

使用单个正则表达式非常麻烦。实际上并不是不可能的,但是你会疯狂地跳这样做,这样你最好还是写一个状态机。但是,通过一系列正则表达式测试很容易做到这一点。

对于条件1和2,文本应与以下内容匹配(允许文本长度只有一个字符):

 ^([a-z0-9._]|[a-z0-9._][a-z0-9_.-]*[a-z0-9._])$  

对于您的条件3,文本应该匹配其中一个正则表达式(选择适当的,您的规范不是很清楚)。

 .*[.-][.-].*
 .*(.-|-.).*
 .*(\.\.|--).*

对于您的条件4,文本应符合以下内容:

 .*[a-z0-9].*  

我不允许在这里使用大写字符。如果需要,将它们添加到字符模式中。

答案 2 :(得分:0)

有趣的问题。可以用非平凡的正则表达式来解决。这是Java语法(需要将正则表达式括在一个字符串中。)

Pattern re_valid = Pattern.compile(
    "    # Regex to validate special word requirements.                                   \n" +
    "    ^                             # Anchor to start of string. And...                \n" +
    "    (?=[A-Za-z0-9._])             # First char is alphanum, dot or underscore. And...\n" +
    "    (?=.*[A-Za-z0-9._]$)          # Last char is alphanum, dot or underscore. And... \n" +
    "    (?=[^A-Za-z0-9]*[A-Za-z0-9])  # Contains at least one alphanum.                  \n" +
    "    (?:                           # Group two possible content formats.              \n" +
    "      [A-Za-z0-9_]+               # Case 1: Begins with one or more non-[-.].        \n" +
    "      (?:                         # Zero or more [-.] separated parts.               \n" +
    "        [-.]                      # Each part separated by one [-.],                 \n" +
    "        [A-Za-z0-9_]+             # followed by one or more non-[-.].                \n" +
    "      )*                          # Zero or more [-.] separated parts.               \n" +
    "      [.]?                        # May end with one [-.].                           \n" +
    "    | [.]                         # Or Case 2: Begins with hyphen or dot.            \n" +
    "      (?:                         # Zero or more [-.] separated parts.               \n" +
    "        [A-Za-z0-9_]+             # One or more non-[-.],                            \n" +
    "        [-.]                      # followed by one [-.].                            \n" +
    "      )*                          # Zero or more [-.] separated parts.               \n" +
    "      [A-Za-z0-9_]*               # May end with zero or more non-[-.].              \n" +
    "    )                             # End group of two content alternatives.           \n" +
    "    $                             # Anchor to end of string.                         ", 
    Pattern.COMMENTS);