使用正则表达式从输入字符串中获取键值字符串?

时间:2016-09-08 15:23:13

标签: java regex

我正在尝试使用正则表达式在字符串中查找键值对(不确定它是否明智!)这是我的字符串:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\SendTrustedIssuerList

key1=key1 value key2=key2 value_key3=something key3=key3_value key1key2是关键。 如您所见,值可以有空格,等待...... 如果您看到key3的值,则其中包含key2key3)!对不起,这就是我的输入。

尚未结束。我可以按照以下任何顺序获得密钥:

key2 value_**key3**=something

现在我想要一个正则表达式,找到正确的键,值组,以便我以后可以建立键值对,如:

key3=key3_value key1=key1 value key2=key2 value_key3=something
key2=key2 value_key3=something key1=key1 value key3=key3_value

我尝试了正则表达式key1=key1 value key2=key2 value_key3=something key3=key3_value ,但这只适用于第一个字符串。如果我按照第2和第3个字符串更改键的顺序,它就消失了!

4 个答案:

答案 0 :(得分:0)

分别执行每个键:

const Hello = (props, context) => <div>{context.name}</div>;
Hello.contextTypes = {
  name: React.PropTypes.string
};

这会在“key1 =”之后提取所有内容而不是空格。由于在键启动之前需要使用单词边界String key1value = input.replaceAll(".*\\bkey1= *(\\S+).*", "$1"); // similar for other keys ,因此处理值中的key3示例。

答案 1 :(得分:0)

这可能会让你开始:

(\w+)=((?:(?!\bkey\w+=).)+)

a demo on regex101.com

在我看来,key2=key2 value_key3=somethingkey2=key2 value_key3=something之间的区别将是最困难的 为了更好的答案,请提供一些真正的输入字符串。

答案 2 :(得分:0)

也许这会对你有所帮助:

\b([a-z\d]+)=(.*?)(?=\b[a-z\d]+=|$)

它依赖于仅由字母数字构造的键。如果可以包含下划线,正如在您的示例中所做的那样,则会失败。 :(如果键可以包含大写字母,则必须设置 ignore case 标志。

它的作用是捕获一个键(允许使用字母和数字),匹配=,然后将所有内容捕获到新键或行尾。

Check it out at regex101

答案 3 :(得分:0)

经过一番认真考虑,这确实是可以解决的,有点棘手:

我遇到的最重要的问题是键的顺序,否则正则表达式key1=(.*)key2=(.*)key3=(.*)就足够了。

所以我首先通过使用Java indexOf

收集密钥来获取密钥的顺序

然后我使用该命令构建正则表达式运行时,代码如下:

List<String> myPropKeys = new ArrayList<String>();
myPropKeys.add("key1");
myPropKeys.add("key2");
myPropKeys.add("key3");

String input1 = "key1=key1 value key2=key2 value_key3=something key3=key3_value";
String input2 = "key3=key3_value key1=key1 value key2=key2 value_key3=something";
String input3 = "key2=key2 value_key3=something key1=key1 value key3=key3_value";

Map<String, String> propMap = getPropValues(input1, myPropKeys);
propMap = getPropValues(input2, myPropKeys);
propMap = getPropValues(input3, myPropKeys);
System.out.println();



private static Map<String, String> getPropValues( String input, List<String> myPropKeys )
{
     Map<String, String> propValues = new HashMap<String, String>();

     StringTokenizer tokens = new StringTokenizer( input );
     List<String> propKeyList = new ArrayList<String>();
     while( tokens.hasMoreTokens() )
     {
         String token = tokens.nextToken();
         int equalsIndex = token.indexOf( "=" );
         if( equalsIndex != -1 )
         {
             String propertyToken = token.substring( 0, equalsIndex );
             if (myPropKeys.contains(propertyToken))
             {
                propKeyList.add( propertyToken );
             }

         }
      }

      StringBuilder sb = new StringBuilder();
      for ( String propKey : propKeyList )
      {
        sb.append( propKey + "=" );
        sb.append( "(.*)" );
      }

      Pattern p = Pattern.compile(sb.toString());
      Matcher m = p.matcher(input);

      List<String> values = new ArrayList<String>();
      if (m.find())
      {
        for ( int i = 1; i <= propKeyList.size(); i++ )
        {
            values.add(m.group(i));
        }

      }

      if ( propKeyList.size() == values.size() )
      {
        for ( int i = 0; i < propKeyList.size(); i++ )
        {
            propValues.put( propKeyList.get(i), values.get(i).trim() );
        }
      }

       return propValues;
}