文件名的正则表达式,带2个下划线和3个分段

时间:2018-12-12 20:07:09

标签: java regex regex-lookarounds regex-group

我需要一个 regex 表达式,该表达式将从属性文件的文件列表中选择具有特定文件名格式的文件。
我需要选择具有以下文件格式的文件名的文件:

<app_name>_<app_version>_<environment>.properties
  • 此处<app_name>可以是任何带有特殊字符<A-Z/a-z/0-9/special char>的字母数字,例如abc123app1-1
  • 此处<app_version>可以是任何带有特殊字符<A-Z/a-z/0-9/special char/float value>的字母数字,例如abc甚至 float / integer / string 1.0或{{1 }}或abc1
  • 此处2可以是任何带有特殊字符<environment>的字母数字,例如<A-Z/a-z/0-9/special char>或prod1

它们一起被2个下划线绑定,如下所示:-

production

文件名始终包含2个下划线<A-Z/a-z/0-9/special char>_<A-Z/a-z/0-9/special char/float value>_<A-Z/a-z/0-9/special char>.properties ,并且可以是下划线之间的任何字符串。
例如,以下是可以选择的有效文件名:

_

下划线之间可以是字母或数字或特殊字符或它们之间的组合。
请注意,文件名中只能有2个下划线app1_1.0_prod1.properties app2_2_prod2.properties app_vers1_prod.properties app-1_vers1_prod-2.properties asd_efg_eee.properties
除2个下划线_以外的任何内容都不是有效的文件名,并且不会被选择,并且文件名应始终将这3个部分用2个下划线_分隔
以下是无效的文件名:

_

我尝试了以下正则表达式:

abc.properties
abc.123.efg.properties
as_1.efg.ddd.rr.properties
ee_rr.properties
_rr_.properties

但不起作用。也许这是错误的。我没有得到这个线索。 请帮助我创建此正则表达式。
谢谢

2 个答案:

答案 0 :(得分:2)

我相信/^[^_]+_[^_]+_[^_]+\.properties$/应该符合您的要求:

const tests = [
  'app1_1.0_prod1.properties',
  'app2_2_prod2.properties',
  'app_vers1_prod.properties',
  'asd_efg_eee.properties',
  'abc.properties',
  'abc.123.efg.properties',
  'as_1.efg.ddd.rr.properties',
  'ee_rr.properties',
  '_rr_.properties'
];

tests.forEach(test => { 
  console.log(test, /^[^_]+_[^_]+_[^_]+\.properties$/.test(test)); 
});

或者,您可以使用/^([^_]+_){2}[^_]+\.properties$/

如果您想限制使用.,那么我认为您想要

/^[^_.]+_([^_.]+|\d+(\.\d+)?)_[^_.]+\.properties$/

答案 1 :(得分:0)

这应该有效,因为每个部分基本上都可以包含除下划线以外的任何字符:/[^_]*_[^_]*_[^_]\.properties/