我想匹配的模式是长度为n的序列,其中n在序列之前正好。正则表达式匹配n次,其中n不固定
例如,当输入为“1aaaaa”时,我想匹配单个字符“a”,因为第一个数字指定只有1个字符匹配。
类似的,当输入为“2aaaaa”时,我想匹配前两个字符“aa”,但不匹配,因为数字2指定两个字符将匹配。
我知道a{1}
和a{2}
会匹配“a”一次或两次。但如何匹配其中n不固定的a{n}
?
是否可以使用正则表达式来进行这种匹配?
我想匹配的模式是长度为n的序列,其中n在序列之前正好。正则表达式匹配n次,其中n不固定
例如,当输入为“1aaaaa”时,我想匹配单个字符“a”,因为第一个数字指定只有1个字符匹配。
类似的,当输入为“2aaaaa”时,我想匹配前两个字符“aa”,但不匹配,因为数字2指定两个字符将匹配。
我知道a{1}
和a{2}
会匹配“a”一次或两次。但如何匹配其中n不固定的a{n}
?
是否可以使用正则表达式来进行这种匹配?
这将适用于重复数字。
import re
a="1aaa2bbbbb1cccccccc4dddddddddddd"
for b in re.findall(r'\d[a-z]+', a):
print b[int(b[0])+1:int(b[0])+1+int(b[0])]
输出:
a
bb
c
dddd
虽然我在Java中已经做了,它会帮助你在你的程序去。
在这里,您可以选择第一字母从给定的输入字符串子串,并用它在你的正则表达式字符串匹配相应。
public class DynamicRegex {
public static void main(String args[]){
Scanner scan = new Scanner(System.in);
System.out.println("Enter a string: ");
String str = scan.nextLine();
String testStr = str.substring(0, 1); //Get the first character from the string using sub-string.
String pattern = "a{"+ testStr +"}"; //Use the sub-string in your regex as length of the string to match.
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(str);
if(m.find()){
System.out.println(m.group());
}
}
}
谢谢。但是该数字可能不是第一个字符,并且可能有不同的长度(例如1a,2aa) 实际上,输入字符串可能比我在问题中陈述的更复杂,例如, input =“1a..2aa ..... 1aaa ...”。我想匹配“1a”,“2aa”和“1a”。 这就是为什么我正在寻找一个可以匹配所有人的正则表达式。 – zhanxw
您正在使用什么语言/工具? –
您必须根据第一个字符动态生成正则表达式。正则表达式不能做到这一点。 – 4castle
@TimBiegeleisen任何语言。如果您在Perl,Python,Java或Javascript中有解决方案,那将会很有帮助。只是想有一个大概的想法。 – zhanxw