Java 正则表达式

Java 正则表达式,java,regex,Java,Regex,我有一根这样的绳子 STAR=20110209 00:01:01 | PNAM=test|.xml | PNUM=480 | SSTA=20110209 00:01:01 | STRT=20110209 00:01:01 |停止=20110209 00:01:01| 我想在这里提取几个键的值 比如PNAM和SSTA的价值是什么 我想要一个正则表达式,可以提供几个键的值,键可以是任意顺序 您喜欢这项工作吗 String str = "STAR=20110209 00:01:01|PNAM=test

我有一根这样的绳子

STAR=20110209 00:01:01 | PNAM=test|.xml | PNUM=480 | SSTA=20110209 00:01:01 | STRT=20110209 00:01:01 |停止=20110209 00:01:01|

我想在这里提取几个键的值

比如PNAM和SSTA的价值是什么


我想要一个正则表达式,可以提供几个键的值,键可以是任意顺序

您喜欢这项工作吗

String str = "STAR=20110209 00:01:01|PNAM=test_.xml|PNUM=480|SSTA=20110209 00:01:01|STRT=20110209 00:01:01|STOP=20110209 00:01:01";
String[] parts = str.split("\\|");

for (String part : parts)
{
    String[] nameValue = part.split("=");

    if (nameValue[0] == "somekey")
    {
        // ..
    }
}

你喜欢这个工作吗

String str = "STAR=20110209 00:01:01|PNAM=test_.xml|PNUM=480|SSTA=20110209 00:01:01|STRT=20110209 00:01:01|STOP=20110209 00:01:01";
String[] parts = str.split("\\|");

for (String part : parts)
{
    String[] nameValue = part.split("=");

    if (nameValue[0] == "somekey")
    {
        // ..
    }
}

因此,正则表达式并不是解决问题的最佳方法。相反,像其他人提供的那样使用split(),但不要使用疯狂的if循环,而是将所有内容加载到映射中

String str = "STAR=20110209 00:01:01|PNAM=test_.xml|PNUM=480|SSTA=20110209 00:01:01|STRT=20110209 00:01:01|STOP=20110209 00:01:01";
String[] parts = str.split("|");
Map<String, String> properties = new HashMap<String, String>();

for (String part : parts) {
    String[] nameValue = part.split("=");
    properties.put(nameValue[0], nameValue[1]);
}
String str=“STAR=20110209 00:01:01 | PNAM=test.xml | PNUM=480 | SSTA=20110209 00:01:01 | STRT=20110209 00:01:01 | STOP=20110209 00:01:01”;
String[]parts=str.split(“|”);
映射属性=新的HashMap();
用于(字符串部分:部分){
字符串[]名称值=部分分割(“”);
properties.put(nameValue[0],nameValue[1]);
}

然后你所要做的就是,
properties.get(“PNUM”)

因此,正则表达式并不是解决问题的最佳方法。相反,像其他人提供的那样使用split(),但不要使用疯狂的if循环,而是将所有内容加载到映射中

String str = "STAR=20110209 00:01:01|PNAM=test_.xml|PNUM=480|SSTA=20110209 00:01:01|STRT=20110209 00:01:01|STOP=20110209 00:01:01";
String[] parts = str.split("|");
Map<String, String> properties = new HashMap<String, String>();

for (String part : parts) {
    String[] nameValue = part.split("=");
    properties.put(nameValue[0], nameValue[1]);
}
String str=“STAR=20110209 00:01:01 | PNAM=test.xml | PNUM=480 | SSTA=20110209 00:01:01 | STRT=20110209 00:01:01 | STOP=20110209 00:01:01”;
String[]parts=str.split(“|”);
映射属性=新的HashMap();
用于(字符串部分:部分){
字符串[]名称值=部分分割(“”);
properties.put(nameValue[0],nameValue[1]);
}
那么您所要做的就是,
properties.get(“PNUM”)
使用以下Java代码:

String str = "STAR=20110209 00:01:01|PNAM=test_.xml|PNUM=480|SSTA=20110209 00:01:01|STRT=20110209 00:01:01|STOP=20110209 00:01:01|";
Pattern p = Pattern.compile("([^=]*)=([^|]*)\\|");
Matcher m = p.matcher(str);
String pnamVal = null, sstaVal = null;
while (m.find()) {
    //System.out.println("Matched: " + m.group(1) + '=' + m.group(2));
    if (m.group(1).equals("PNAM"))
        pnamVal = m.group(2);
    else if (m.group(1).equals("SSTA"))
        sstaVal = m.group(2);

    if (pnamVal != null && sstaVal != null)
       break;
}
System.out.println("SSTA: " + sstaVal);
System.out.println("PNAM: " + pnamVal);
输出 使用以下Java代码:

String str = "STAR=20110209 00:01:01|PNAM=test_.xml|PNUM=480|SSTA=20110209 00:01:01|STRT=20110209 00:01:01|STOP=20110209 00:01:01|";
Pattern p = Pattern.compile("([^=]*)=([^|]*)\\|");
Matcher m = p.matcher(str);
String pnamVal = null, sstaVal = null;
while (m.find()) {
    //System.out.println("Matched: " + m.group(1) + '=' + m.group(2));
    if (m.group(1).equals("PNAM"))
        pnamVal = m.group(2);
    else if (m.group(1).equals("SSTA"))
        sstaVal = m.group(2);

    if (pnamVal != null && sstaVal != null)
       break;
}
System.out.println("SSTA: " + sstaVal);
System.out.println("PNAM: " + pnamVal);
输出
每个键只能出现一次吗?值是否可以包含分隔符“|”您是否可以在上拆分字符串,然后在上拆分部分?值没有分隔符“|”,并且一个键只显示一次。每个键只能显示一次?值是否可以包含分隔符“|”您是否可以在上拆分
上的字符串,然后拆分
=
上的部分?值没有分隔符“|”,并且键只显示一次。应为str.split(\\\\124;”);或者你会得到有趣的结果。我不想两次使用split,因为它们可以是100个键、值对,这样做似乎太过致命了。100个对看起来像是小变化,真的。应该是str.split(\\\\\;);或者你会得到有趣的结果。我不想使用拆分两次,因为它们可以是100个键、值对,这样做似乎太过致命。100个键对看起来很小,真的。和其他基于拆分的答案一样<代码>|需要转义,否则它将在原始字符串中的每个字符上拆分(包括文本的开头和结尾)。与其他基于拆分的答案相同<代码>需要转义,否则它将在原始字符串中的每个字符上拆分(包括文本的开头和结尾)。我将以这种方式使用ur表达式([PNAM | SSTA | STAR]*)=([^ |]*)\\\\\确定您可以使正则表达式更具限制性。稍微更正一下,在这种情况下,您的正则表达式应该是
“(PNAM | SSTA | STAR)=([^ SSTA]*)\\\\\”
我将以这种方式使用ur表达式([PNAM | SSTA | STAR]*)=([^ SSTA]*)\\\\\;当然您可以让正则表达式更严格一些。稍加更正,在这种情况下,您的正则表达式应该是
“(PNAM | SSTA | STAR)=([^ SSTA]*)\\\\\\”