【问题标题】:Pattern java : 2 caracters less than n times and their sum of appereance less n too模式java:2个字符少于n次,它们的出现总和也少于n
【发布时间】:2020-03-17 08:08:44
【问题描述】:

我想找出一个字符串是否以一个字符(出现在 1 和 9 之间)和第二个字符(也出现在 1 和 9 之间)开头,但它们的出现总和必须(正好)10,总和必须是10. 第一个字符数 + 第二个字符数 = 10。

我想知道是否可以一次完成,或者是否不可能:我是否应该分两次完成。

我的第一个字符是空格:“\s” 我的第二个字符是一个数字,但不是 0 : [1-9][0-9]*

但你可以用字符a和b解释,我会适应它。

String w = "         1"          //ok
String x = " 123456789"          //ok
String z = "  123456789"         //must be not ok (11 char)
String y = "         123456789"  //must be not ok

Pattern my_pattern = patter.compile("^\\s+[1-9][0-9]*");
Pattern my_pattern2 = patter.compile("^\\s{1,9}[1-9][0-9]{1,9}");

my_pattern不好,他允许的模式太多了。

my_pattern2 对空格数和位数做了限制,但对总和没有限制,我该怎么做?

一个解决方案是这样写 9 种可能性:

Pattern my_pattern3 = patter.compile("(a{1}b{9}|a{2}b{8}|a{3}b{7}|etc)");

但如果你有一个通用的解决方案,我更喜欢它。

感谢您的关注

【问题讨论】:

  • 字符串必须以字符开头?如果是这样,只对您提到的约束进行编码会更容易理解。此外,不清楚您所说的“外观总和”是什么意思。
  • 对不起,“外观总和”是 a 和 b 2 个字符的总和。 a和b的个数之和必须是10。

标签: java matcher


【解决方案1】:

你好 Jules,欢迎来到堆栈溢出!

TLDR;您已经给出的答案是使用正则表达式执行此操作的唯一方法

要回答您的问题,我们需要讨论正则表达式,这是 java Pattern 类用于匹配文本字符串的内容(维基百科 here)。正则表达式只能匹配一小类模式,称为正则语言。众所周知,它们不能用于检查括号是否匹配:

(((())())())() <-- Like this

我们在这里遇到的问题是正则表达式无法检查是否存在相同数量的东西(即左括号和右括号)。这与您检查两个长度加起来是否为 10 的问题非常相似。但是,因为在您的情况下存在有限数量的可能性(与匹配括号不同),所以可以这样做,但只能像您已经完成的那样枚举所有可能的情况。恐怕没有更好的方法可以仅使用正则表达式来做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2017-12-24
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    相关资源
    最近更新 更多