我正在尝试使用正则表达式在字符串中查找键,值对(不确定这是否明智!),这是我的字符串:
key1=key1 value key2=key2 value_key3=something key3=key3_value
key1
,key2
,key3
是关键。如您所见,值可以有空格,然后等待...如果您看到的值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=(.*)
,但这仅适用于第一个字符串。如果我更改第二和第三字符串中的键顺序,它就消失了!
经过一番认真的思考,这确实是可以解决的,有点棘手:
我面临的最重要的问题是键的顺序,否则正则表达式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] 删除。
我来说两句