【问题标题】:Regex for 4-Block-Pattern combined with min and max lentgh4-Block-Pattern 的正则表达式结合最小和最大长度
【发布时间】:2022-01-21 09:34:52
【问题描述】:

我有一个 4 块格式 的公式(例如 1232 2131 3233 2323 23)。

我想要的是检查一个输入字符串,如果它用最大长度来匹配这个模式。

我找到了一种固定长度的方法......例如".{4} .{4} .{2}" 用于固定长度 10(空格不应计入长度)

但是,如果我想检查 4 块模式的最大字符数的可变长度,正则表达式的外观如何。

假设 4-Block for max-length of 10 个字符,这将允许所有这些:“XXX”、“XXXX”、“XXXX XX”、“XXXX XXXX”、“ XXXX XXXX”和“XXXX XXXX XX”。

我尝试使用该签名构建一个 java 函数:

public static String getRegex(int blockSize, int maxLength) {

}

感谢您的脑力。

【问题讨论】:

  • 请在此处包括一些您期望的各种长度类型的匹配示例。
  • 假设我的 MaxLength 为 10。那么我需要允许“XXX”、“XXXX”、“XXXX XX”、“XXXX XXXX”和“XXXX XXXX”。那个正则表达式会是什么样子?

标签: java regex


【解决方案1】:

您可以使用括号对符号进行分组。并在 {} 中用逗号给出两个数字,表示 min 和 max 出现。对于您提到的情况:(.{4} .{4}){1,2}。 所以它会检查它是否是: XXXX XXXX 或者 XXXX XXXX XXXX XXXX 如果您想检查是否只有此模式在字符串中,您还应该在开头添加“^”,在末尾添加“$”。 然后它应该看起来像: ^(.{4} .{4}){1,2}$

^ 表示行首 $ 表示行尾

【讨论】:

  • 很好,但假设我的 MaxLength 为 10。然后我需要允许“XXX”、“XXXX”、“XXXX XX”、“XXXX XXXX”和“XXXX XXXX”。那个正则表达式会是什么样子?
  • 哦,现在我得到了你想要的。我会在某些步骤中做到这一点。也许有更好的方法。我会计算至少和最多整个 4 块发生多少次。可以通过 a=floor(minLength%5) 和 b=floor(maxLength%5) 来完成。所以我得到了类似的东西: "(.{4}){a,b}" 。但是仍然可以留下字符(从 1 到 4,因为我们除以 5,因此最后 4 个没有空格的字符也可以是第 5 个字符)。所以我会像 "(.{4}){a,b}( .{1,4}){0,1}" 那样检查这个并单独检查字符串的长度。
【解决方案2】:

我会首先计算最大长度包括可能的空格,这取决于块的数量和大小。所以说块大小为 4:

  • 如果最大长度为 7,则最大空格数为 1 (XXXX XXX)
  • 如果最大长度为 8,则最大空格数为 1 (XXXX XXXX)
  • 如果最大长度为 9,则最大空格数为 2 (XXXX XXXX X)

这可以概括如下:

int numberOfWhitespacesAllowed = (maxLength - 1) / blockSize;
int maxLengthIncludingWhitespaces = maxLength + numberOfWhitespacesAllowed;

现在我们知道了这一点,我们可以更轻松地构建正则表达式,首先检查一般模式:

^(\S{<blocksize>}\s)*\S{1,<blocksize>}$

例如块大小为 4:

^(\S{4}\s)*\S{1,4}$

然后使用 positive lookahead 添加检查最大长度:

^(?=.{1,<maxLengthIncludingWhitespaces>}$)

例如,最大长度(包括空格)为 9:

^(?=.{1,9}$)(\S{4}\s)*\S{1,4}$

Java 中的所有内容:

public static String getRegex(int blockSize, int maxLength) {
    int numberOfWhitespacesAllowed = (maxLength - 1) / blockSize;
    int maxLengthIncludingWhitespaces = maxLength + numberOfWhitespacesAllowed;
    return "^(?=.{1," + maxLengthIncludingWhitespaces + "}$)(\\S{" + blockSize + "}\\s)*\\S{1," + blockSize + "}$";
}

块大小为 4:

  • 最大长度为 7:^(?=.{1,8}$)(\S{4}\s)*\S{1,4}$
  • 最大长度为 8:^(?=.{1,9}$)(\S{4}\s)*\S{1,4}$
  • 最大长度为 9:^(?=.{1,11}$)(\S{4}\s)*\S{1,4}$

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多