s:3\"content\";s:15\"another content\";
所以重复模式就像“s :(字符串的长度)\”(字符串内容)\“;” 我想要获取字符串的内容。
我试过“[s:(。*);] +”,我希望至少得到3 \“内容\”和15 \“另一个内容\”,但我得到了完全错误的结果。
有没有人知道如何从这种模式中获取字符串内容?
非常感谢...
答案 0 :(得分:2)
这是Python,你需要做一些工作才能使它对Java友好:
>>> import re
>>> s='s:3\"content\";s:15\"another content\";'
>>> re.compile('s:[0-9]+\\"([^"]+)\\";').findall(s)
['content', 'another content']
对于第二个字符串,感谢Filgera建议使用非贪婪的通配符:
>>> s='s:11:\"strin1\";s:6:\"\\\"\\\"\\\"\";s:4:\"string2\";s:2:\"52\";s:4:\"string3\";s:16:\"08\/23\/2011 00:00\";s:5:\"where\";s:9:\"\\\" \\\"\\\"\\\"\";'
>>> re.compile('s:[0-9]+:\\"(.*?)\\";').findall(s)
['strin1', '\\"\\"\\"', 'string2', '52', 'string3', '\xe2\x80\x8b08\\/23\\/2011 00:00', 'where', '\\" \\"\\"\\"']
答案 1 :(得分:0)
怎么样
s:\d+"([a-zA-Z0-9 ]*)";
它将匹配以下格式s:3"My Content";
并捕获内容字符串。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ContentExtractor {
// For a long concatenated String
private static String concatenatedPattern = "s:\\d+\"([a-zA-Z0-9 ]*)\";";
private static String concatenatedString = "s:22\"This is a test string\";s:10\"Another Test\";";
// When dealing with the tokens, usable after using the split method on the concatenated
private static String tokensPattern = "^s:\\d+\"([a-zA-Z0-9 ]*)\"$";
private static String[] tokens = new String[]{
"s:3\"two\"",
"s:10\"Token Content\""
};
public static void main(String args[]) {
Matcher matcher;
System.out.println("======= Long concatenated String======");
matcher = Pattern.compile(concatPattern).matcher(concatenatedString);
while( matcher.find() ) {
System.out.println( matcher.group(1) );
}
System.out.println("==== single tokens ====");
for (String token : tokens) {
matcher = Pattern.compile(tokensPattern).matcher(token);
if (matcher.find()) {
System.out.println( matcher.group(1) );
}
}
}
}