我正在尝试制定匹配以下模式的公式: 输入字符串示例:
'444'/'443'/'434'/'433'/'344'/'334'/'333'
如果特定输入字符串中存在上述任何模式,我想将其匹配为相同的模式。
是否可以使用正则表达式进行变量替换?意思是通过将每个字符用作变量来检查字符串的3个字符,并且只对每个字符进行递增/递减?这样你就不必为不同的模式指定特定的数字范围(硬编码模式字符串)?
有没有可用于此的好库?我正在使用Java中的Pattern类。
如果您有任何有用的链接,请通过:) 谢谢。
答案 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.Compile
以String
为参数。虽然这可能最常以字符串文字的形式提供,但如果您的模式具有可变的上限和下限,则可以使用类似StringBuilder
的内容来构建字符串,然后将结果传递给{{1} }。