我正在做一个小项目,我必须用命令读取行。
命令是与模式"\\&[abcd]"
匹配的字符串
如果前一个匹配和下一个匹配之间有字符串,我必须根据上一个命令对它进行操作。我使用while (m.find())
进行循环,我可以得到与模式匹配的字符串(即命令),但我不确定如何获得与模式不匹配的字符串。用""
替换命令并获取整个字符串将是一种方式,但后来我无法对特定的子字符串进行操作。
那么如何根据上一个命令对命令之间的字符串进行操作呢?
代码我在撰写时遇到了问题:
int i=0;
while (m.find()) {
switch (m.group()) {
case "&a":
i+=1;
break;
case "&b":
i+=2;
break;
case "&c":
i=4;
break;
...
}
//get non-pattern matching strings and modify it based on previous commands.
}
输入后:$a$bLola$cg
会产生以下输出:LolaLolaLolagggg
编辑:
未设置命令或字符串的数量,可以按任何顺序排列。如果没有字符串,则不会打印任何内容。如果没有命令,将打印字符串而不进行修改
重复答案似乎不适用于此:正则表达式仅捕获字符串(而非命令)不起作用,因为在第一个while(m.find())
循环之后{{1}会彻底改变。
输入后:i
会输出$a$bLola$cg
。
答案 0 :(得分:-1)
这种方法的工作方式是在单个匹配中捕获命令和字符串 只要有一个命令,就会解析整个输入 然后每个匹配将给出命令和字符串(分别为组1和2)。
每当你捕获一个字符串时,根据命令和
执行对它的操作
将其附加到新字符串。
这是字符串之前的命令:
# "(?s)(&[abcd])((?:(?!&[abcd]).)+)?"
(?s) # Dot-all modifier, dot matches any character
( & [abcd] ) # (1), Command, required
( # (2 start), String
(?: # Cluster start
(?! & [abcd] ) # Lookahead assertion, not a command ahead
. # Assertion passed, grab this character
)+ # Cluster end, do 1 to many times
)? # (2 end), optional
这是字符串后面的命令:
随便挑选。
# "(?s)((?:(?!&[abcd]).)+)?(&[abcd])"
(?s) # Dot-all modifier, dot matches any character
( # (1 start), String
(?: # Cluster start
(?! & [abcd] ) # Lookahead assertion, not a command ahead
. # Assertion passed, grab this character
)+ # Cluster end, do 1 to many times
)? # (1 end), Optional
( & [abcd] ) # (2), Command, Required