Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:查找文档中的任何字符串_Java_Regex - Fatal编程技术网

Java:查找文档中的任何字符串

Java:查找文档中的任何字符串,java,regex,Java,Regex,我在正则表达式方面非常糟糕,所以我希望你能帮助我: 我编写了一个类,它可以打开一个odf文档,搜索一些给定的关键字(hashmap中的关键字),并用其他odf文件的内容(hashmap的值)替换这些关键字。到目前为止,该类已完成,只缺少正则表达式部分。如果键只是像“FILE”或“REPLACETHIS”这样的字符串,那么一切都可以工作。 但是我还需要能够替换字符串,比如“{File_1}}”、“”、“!replace this!”等等。这些字符串可以由用户选择,因此可能性是无穷的。 这些字符串也

我在正则表达式方面非常糟糕,所以我希望你能帮助我:

我编写了一个类,它可以打开一个
odf
文档,搜索一些给定的
关键字(hashmap
中的
关键字),并用其他
odf文件的内容(hashmap的值)替换这些关键字。到目前为止,该类已完成,只缺少正则表达式部分。如果键只是像“FILE”或“REPLACETHIS”这样的字符串,那么一切都可以工作。
但是我还需要能够替换字符串,比如“{File_1}}”、“”、“!replace this!”等等。这些字符串可以由用户选择,因此可能性是无穷的。
这些字符串也可以是其他字符串的一部分,例如:“this is so[替换此]me text”

我希望你理解我的想法,这是可能的

-e- 是的,我必须使用正则表达式,因为我正在使用的库需要一个模式。编译对象

据我所知(如果我错了,请随时纠正我)。您的主要问题是具有特殊正则表达式含义的字符。为什么不在编译模式之前转义这些字符呢

myPattern = "some user defined word with { strange characters";
myPattern = myPattern.replaceAll( "\\{", "\\{" );
myPattern = myPattern.replaceAll( "\\}", "\\}" );
myPattern = myPattern.replaceAll( "\\.", "\\." );
...
Pattern regex = Pattern.compile( myPattern );

IMHO,做我认为你想做的事情的最短方法是(你在帖子下面的评论中确认了这一点):

这样,字符将失去其特殊的正则表达式含义,用户可以输入他们想要的任何内容


请阅读中有关这些方法的更多信息。

我对正则表达式非常不擅长,我和其他许多人也是如此,但请向我们展示您迄今为止的尝试。我想您将尝试(1)制作密钥正则表达式模式,并在搜索中应用到文档。(2) 使hashmap值为regex并应用regex替换。一路上,你会更好地使用正则表达式。没有捷径可以让你轻松地使用正则表达式来完成这项工作。但是,不要觉得你必须一下子精通正则表达式,而是开始尝试,逐步提高你的舒适度。好吧,我明白了。事实上,我对正则表达式一无所知,但我真的很愿意在我学习完RoR之后马上学习它。为什么不使用
Pattern Pattern=Pattern.compile(Patern.quote(yourstringtobereplace))?如果您发现@jlordo中的所有信息都是正确的,您将获得用户输入,然后将其放入他给您的代码中。有什么问题吗?如果有现成的方法,比如使用\Q…。\E或jlordo指出的
patren.quote(YourStringToBereplace)
:)我必须承认我不熟悉这些特殊类。谢谢你的观点。你在发帖前试过吗?你的替换根本不会改变字符串。你需要
myPattern.replaceAll(“\\{”,“\\\{”)
才能得到你想要的。这就是为什么
Pattern.quote()
容易得多的原因。
replaceAll()
的JavaDoc说:注意反斜杠(\)和美元符号($)在替换字符串中,如果将其视为文字替换字符串,则可能会导致结果不同;请参阅Matcher.replaceAll。如果需要,请使用Matcher.quoteReplacement(java.lang.string)来抑制这些字符的特殊含义。
Pattern pattern = Pattern.compile(Pattern.quote(yourStringToBeReplaced));