我有以下格式的字符串:
基本上, [(xx)(KEYX)some text] 形式在与其他字符混合的字符串中出现一次或多次。
在上面的格式中,键是 KEYX ,值是一些文本。
我想从包含任意数量此类格式的任何字符串中提取所有键值对。
我尝试使用子字符串等直接解析,但这似乎不是一个干净的解决方案。是否可以使用正则表达式或Java提供的任何其他技术更好地做到这一点?
答案 0 :(得分:1)
您可以使用正则表达式和匹配器来查找您的密钥和值:
public static void main(String[] args) throws IOException
{
String test = "[(xx)(KEYX)some text]";
Pattern pattern = Pattern.compile("\\(KEY.*\\)");
Matcher matcher = pattern.matcher(test);
matcher.find();
String s = matcher.group(0);
String s1 = test.substring(matcher.end(), test.length() - 1);
System.out.println("" + s + " " + s1);
}
输出结果如下:
(KEYX) some text
如果您将字符串更改为"[(xx)(KEYXYYYYYY)some text]"
,那么它将是:
(KEYXYYYYYY) some text
如果您不想在键周围使用括号:
public static void main(String[] args) throws IOException
{
String test = "[(xx)(KEYXYYYYYY)some text]";
Pattern pattern = Pattern.compile("(?<=\\()KEY.*(?=\\))");
Matcher matcher = pattern.matcher(test);
matcher.find();
String s = matcher.group(0);
String s1 = test.substring(matcher.end() + 1, test.length() - 1);
System.out.println("" + s + " " + s1);
}
输出将是:
KEYXYYYYYY some text
*************** *************** UPDATE ********************************** ************************ 匹配任何关键不仅仅是KEY:
public static void main(String[] args) throws IOException
{
String test = "[(xx)(time.zone1)some text]";
Pattern pattern = Pattern.compile("(?<=\\()[^xy].*(?=\\))");
Matcher matcher = pattern.matcher(test);
matcher.find();
String s = matcher.group(0);
String s1 = test.substring(matcher.end() + 1, test.length() - 1);
System.out.println("" + s + " " + s1);
}
这将输出:
time.zone1 some text
*************** *********** UPDATE ************************************** ********
相同字符串中的多个匹配项:
public static void main(String[] args) throws IOException
{
String test = "[(xx)(time1.zone1)some text1]blahblahblah[(xx)(time2.zone2)some text2]";
Pattern pattern = Pattern.compile("(?<=\\()[^xy].*?]");
Matcher matcher = pattern.matcher(test);
while(matcher.find())
{
String s = matcher.group(0);
String s1 = s.substring((s.indexOf(")") + 1), (s.length() - 1));
s = s.substring(0, s.indexOf(")"));
System.out.println("" + s + " " + s1);
}
}
这将输出:
time1.zone1 some text1
time2.zone2 some text2
答案 1 :(得分:0)
如果我理解你的问题,你可以依靠KEY
从第四个角色开始,然后找到下一个&#34;)&#34;像
String str = "(xx)(KEY1)some text";
int open = str.indexOf("(", 4);
int pos = str.indexOf(")", 4);
str = str.substring(open + 1, pos);
System.out.println(str);
输出
KEY1