我试图在Java中使用正则表达式来匹配任何字符串字符串,但是却遇到了问题。我正在尝试使用hashmap中的相应值替换字符串包含%key%
的位置。
我的醋栗正则表达式模式是%([.]+)%
,似乎不起作用,但我不确定为什么。我试过%([a-z A-Z 0-9])%
似乎工作正常,但我想允许所有的charichters但新的行和“。”除了fullstops之外似乎不允许任何其他内容(例如%...%
会有问题,但%test%
不会。
老实说,我不确定我做错了什么,我认为我在错误的地方使用了fullstop,但似乎无法找到如何正确使用它。
对于可怕的解释感到抱歉,我想不出如何把它变得更好。
感谢。
答案 0 :(得分:4)
I would like to allow all charichters but new line and "."
您可以使用此基于否定的正则表达式:
%([^.%\\n\\r]*)%
[^.%\\n\\r]
表示匹配除DOT OR %
或新行字符
答案 1 :(得分:1)
使用(?<=%)(.+?)(?=%)
。
<强>说明强>
示例代码:
HashMap<String , String> map=new HashMap<>();
map.put("1", "one");
map.put("2", "two");
map.put("3", "three");
String line="%123%";
Pattern pattern=Pattern.compile("(?<=%)(.+?)(?=%)");
Matcher matcher=pattern.matcher(line);
if(matcher.find()){
String match=matcher.group();
Iterator<String> it=map.keySet().iterator();
while(it.hasNext()){
String key=it.next();
if(match.contains(key)){
line=line.replace(key, map.get(key).toString());
}
}
System.out.println(line);
}
<强>输出强>
%onetwothree%
答案 2 :(得分:0)
尝试:
System.out.println("%sdfsdf%".matches("^%.+%$"));
我认为在某些情况下Regex是不够的 - 你也应该做一些逻辑。
您可以尝试使用StringBuilder
。
答案 3 :(得分:0)
你想使用类似的东西:
%([^.]+?)%
?
表示非贪婪。
[^.]
表示没有完全停止。
鉴于输入:
%inside1%something%inside2%
它会匹配
%inside1%
和%inside2%
[.]
的问题在于它实际上是句号。
修改强> 如果你逐行匹配,那么我的就好了。如果您要跨多行匹配,那么您应该使用anubhava回答明确排除匹配中的换行符,这样就可以从结果中排除匹配行数%的多行查询。