模式匹配 - 字符串搜索

时间:2010-08-23 03:32:52

标签: java regex

我正在尝试制定匹配以下模式的公式: 输入字符串示例:

'444'/'443'/'434'/'433'/'344'/'334'/'333'

如果特定输入字符串中存在上述任何模式,我想将其匹配为相同的模式。

是否可以使用正则表达式进行变量替换?意思是通过将每个字符用作变量来检查字符串的3个字符,并且只对每个字符进行递增/递减?这样你就不必为不同的模式指定特定的数字范围(硬编码模式字符串)?

有没有可用于此的好库?我正在使用Java中的Pattern类。

如果您有任何有用的链接,请通过:) 谢谢。

3 个答案:

答案 0 :(得分:1)

让我们首先考虑这种模式:[34]{3}

[…]character class,它只匹配集合中的一个字符。 {n}是完全有限的repetition

因此,[34]{3}非正式地表示“正好3 '3''4'”。因此,它匹配"333""334""343""344""433""434""443",{{1}没有别的。

作为字符串文字,模式为"444"。如果您不想对此模式进行硬编码,则只需生成遵循此模板"[34]{3}"的类似外观的字符串。只需在"[…]{n}"中添加您要匹配的字符,然后将替换为您想要的数字。

以下是一个例子:

n

我们现在已经看到该模式不是硬编码的,而是根据变量 String alpha = "aeiou"; int n = 5; String pattern = String.format("[%s]{%s}", alpha, n); System.out.println(pattern); // [aeiou]{5} alpha的值以编程方式生成的。模式n将连续5个小写元音,例如[aeiou]{5}"ooiae""ioauu"

再次不清楚您是否只想匹配这些类型的字符串,或者它们是否必须显示为"eeeee"。如果需要后者,那么只需根据需要使用重复和grouping组合模式。如果更简单,您也可以以编程方式复制并粘贴模式5次。这是一个例子:

'…'/'…'/'…'/'…'/'…'

现在将匹配 String p5 = String.format("'%s'/'%<s'/'%<s'/'%<s'/'%<s'", pattern); System.out.println(p5); // '[aeiou]{5}'/'[aeiou]{5}'/'[aeiou]{5}'/'[aeiou]{5}'/'[aeiou]{5}' 等字符串。

买者

请注意"'aeooi'/'eeiuu'/'uaooo'/'eeeia'/'eieio'"中的内容。具体而言,alpha-[]&&等是Java字符类定义中的特殊元字符。如果您将^限制为仅包含数字/字母,那么您可能不会遇到任何问题,例如alpha NOT 表示“[^a]'^'”。它实际上意味着“除'a'以外的任何内容。请参阅java.util.regex.Pattern以获取确切的字符类语法。

答案 1 :(得分:0)

您可以使用正则表达式:

('\\d{3}'/){6}'\\d{3}'

答案 2 :(得分:0)

Pattern.CompileString为参数。虽然这可能最常以字符串文字的形式提供,但如果您的模式具有可变的上限和下限,则可以使用类似StringBuilder的内容来构建字符串,然后将结果传递给{{1} }。