我正在尝试使用正则表达式在字符串中查找键值对(不确定它是否明智!)这是我的字符串:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\SendTrustedIssuerList
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
,但这只适用于第一个字符串。如果我按照第2和第3个字符串更改键的顺序,它就消失了!
答案 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+=).)+)
在我看来,key2=key2 value_key3=something
和key2=key2 value_key3=something
之间的区别将是最困难的
为了更好的答案,请提供一些真正的输入字符串。
答案 2 :(得分:0)
也许这会对你有所帮助:
\b([a-z\d]+)=(.*?)(?=\b[a-z\d]+=|$)
它依赖于仅由字母数字构造的键。如果键可以包含下划线,正如值在您的示例中所做的那样,则会失败。 :(如果键可以包含大写字母,则必须设置 ignore case 标志。
它的作用是捕获一个键(允许使用字母和数字),匹配=
,然后将所有内容捕获到新键或行尾。
答案 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;
}