多行配置文件中的正则表达式,不等于

时间:2016-06-24 09:29:32

标签: java regex

我一直在努力研究这个,但我很难找到相关的帖子。我们使用配置文件作为我们的服务之一,如下所示(注意,一些名称在哈希后有空格,有些名称有参数):

#GetContactDetails
GetContactDetails.XXXXUser=USERNAME
GetContactDetails.XXXXPassword=PASSWORD
GetContactDetails.TestFlag=Y
GetContactDetails.EndPointURL=http://111.99.111.999/ENVNAME2/endpoint.xx
GetContactDetails.Timeout=40000
GetContactDetails.LoggingFlag=Y

# GetContactDetails
GetContactDetails.XXXXUser=USERNAME
GetContactDetails.XXXXPassword=PASSWORD
GetContactDetails.TestFlag=Y
GetContactDetails.EndPointURL=http://111.99.111.999/ENVNAME2/endpoint.xx
GetContactDetails.Timeout=40000
GetContactDetails.LoggingFlag=Y

# GetContactDetails Parameters
GetContactDetails.XXXXUser=USERNAME
GetContactDetails.XXXXPassword=PASSWORD
GetContactDetails.TestFlag=Y
GetContactDetails.EndPointURL=http://111.99.111.999/ENVNAME2/endpoint.so
GetContactDetails.Timeout=40000
GetContactDetails.LoggingFlag=Y

基本上有4种不同的变体:

#servicename
# servicename
#servicename parameters
# servicename parameters

我希望能够在此文本文件上运行替换,为我留下每个服务的名称(只是以#开头的行)。意思是我需要识别任何不等于#行模式的东西。我尝试过的所有组合,我都无法识别其他所有组合。

有什么建议吗?

P.S。 (来自评论)

我希望使用正则表达式,因为现有的Java服务可以使用正则表达式替换。沿着这条路走下去需要编写一个Java服务并部署它,尽管不是太大的任务,但我想尽可能避免它。

4 个答案:

答案 0 :(得分:1)

Search: ^[^#].*[\r\n]*
Replace: <blank>

关键部分是^[^#],这意味着“第一个字符不是哈希”

您需要[\r\n]*也匹配换行符(点与换行符不匹配),否则您将留下空行(而不是删除它们)。

答案 1 :(得分:1)

在Java中,此任务的最佳方法是逐行读取文件并收集以#开头的行。

如果要将正则表达式应用于整个文件内容,则应为

.replaceAll("(?m)^(?!#).*[\r\n]*", "")

请参阅regex demo

<强>解释

  • (?m)^ - 行的开头(?m)是内联修饰符,使^匹配行的开头,而不是字符串)
  • (?!#) - 确保该行的第一个符号不是#(如果是,则不返回匹配项)
  • .* - 除换行符之外的零个或多个符号
  • [\r\n]* - 零个或多个CR或LF符号(在Java 8中,可以用"\\R*"替换)

对于您的确切环境,我认为您可以使用

[^#].*

并且 - 也匹配空字符串 - 如果它们可以在那里删除:

^$

你说[^#].*\..*对你有用。这是它实际做的:

  • [^#] - 匹配#
  • 以外的字符
  • .* - 尽可能多地匹配除换行符之外的1个或多个字符
  • \. - 文字.
  • .* - 匹配除换行符之外的1个或多个字符,直到行尾。

答案 2 :(得分:1)

另一种解决方案:

#\s?(\w+)\s?(\w+)?

在记事本中++ ctrl + h-&gt;粘贴代码 - &gt;替换为&#39; &#39;

答案 3 :(得分:0)

以下似乎可以正常用于预期目的。在此处发布以防对浏览此问题的任何人都有用。感谢所有帮助&amp;建议。

[^#].*\..*