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

SomeDude

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

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

key1key2key3是关键。如您所见,值可以有空格,然后等待...如果您看到的值key2,则它包含key3在其中(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

我尝试了regex key1=(.*)key2=(.*)key3=(.*),但这仅适用于第一个字符串。如果我更改第二和第三字符串中的键顺序,它就消失了!

SomeDude

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

我面临的最重要的问题是键的顺序,否则正则表达式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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

字符串中的正则表达式键值

使用正则表达式删除字符串中的键值

使用正则表达式拆分键值中的字符串

正则表达式从输入字符串中获取一些值

正则表达式从字符串中获取字符串

正则表达式从字符串中获取子字符串

使用正则表达式获取多个可能字符串的子字符串

使用正则表达式从字符串日期获取子字符串

使用正则表达式获取子字符串(带有“”的字符串)

使用正则表达式从特殊字符前后的字符串中获取数字

使用ruby中的正则表达式从字符串中获取子字符串

正则表达式验证输入字符串

使用正则表达式从复杂字符串中查找子字符串

如何使用正则表达式从字符串中删除特定字符串

使用正则表达式搜索字符串中的子字符串

使用正则表达式从字符串中的提取字符串

使用正则表达式组替换字符串中的子字符串

使用JavaScript中的正则表达式输入字符串测试

使用正则表达式从R中的字符串中获取数据

获取子字符串正则表达式

在VBA中使用正则表达式仅获取字符串中的数字

如何通过使用正则表达式从字符串中获取特定值

使用字符串中的正则表达式获取特定范围

在bash中使用正则表达式从字符串中获取值

在R中使用正则表达式从字符串中获取数字

使用正则表达式获取字符串中模式的索引

Python:从非分隔字符串中获取数字。使用正则表达式?

使用正则表达式在字符串中获取零件

使用正则表达式从字符串中获取经度/经度