2

我是正则表达式的新手。在过去的几个小时里,我一直在阅读有关 regex 的内容,以了解如何使用 regex* 来实现以下目标,但运气不佳。我的大脑已经开始疼了。因此,这呼救。以下是我想应用于数据输入字段的限制,我应该使用什么正则表达式?

  1. 第一个和最后一个字符应该是字母数字“。” (即点)或“_”(即下划线)
  2. 第一个和最后一个字符之间的字符可以是字母数字“.”。(即点)、“_”(即下划线)或“-”(即连字符)
  3. 人物 ”。” (即点)和“-”(即连字符)不能连续出现。
  4. 输入中应至少有一个字母数字字符。

一些有效的输入数据:

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

谢谢并恭祝安康,

~插头

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

3 回答 3

2

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

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

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

有人可能会提供格式更好的格式,但它似乎适用于http://www.regex101.com/我测试过的所有内容。

于 2013-06-04T13:17:22.813 回答
2

这与单个正则表达式有关。实际上并非不可能,但你会疯狂地做这件事,这样你最好写一个状态机。但是,通过一系列正则表达式测试很容易做到这一点。

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

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

对于您的条件 3,文本不应这些正则表达式之一匹配(酌情选择,您的规范不是很清楚)。

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

对于您的条件 4,文本应与以下内容匹配:

 .*[a-z0-9].*  

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

于 2013-06-04T13:29:45.290 回答
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);
于 2013-06-04T19:16:36.860 回答