【问题标题】:Extract a part of a regex name提取正则表达式名称的一部分
【发布时间】:2019-11-13 11:10:31
【问题描述】:

文件名示例

  1. FDIP_en-gb-nn_Text_v1_YYYYMMDD_SequenceNumber.txt

  2. FDIP_fr-fr-nn_Text_v1_YYYYMMDD_SequenceNumber.txt

  3. FDIP_de-de-nn_Text_v1_YYYYMMDD_SequenceNumber.txt

正则表达式是FDIP_([a-z]{2}-[A-Z]{2}-[a-z]{2})_Text_v1_[0-9]{8}_[0-9]{14}.txt

我需要的唯一部分是翻译代码,即“en-gb”、“fr-fr”、“de-de”。

如何只提取文件名的那一部分?

【问题讨论】:

标签: javascript


【解决方案1】:

稍微修改了正则表达式以匹配数字和文本。你可以玩转here

解释 要捕获一个组,您需要将正则表达式包装到 () 这将捕获为一个组。

要进行命名捕获,您可以(?<name_of_group>),然后您可以按名称访问。

这里是匹配过程。

[a-z]{2} 匹配来自 a-z 的 2 个字符

[a-zA-Z0-9] 匹配a-z or A-Z or 0-9 的任何字符

g 表示全局标志,即匹配所有。

i 表示忽略大小写。

var r = /FDIP_([a-z]{2}-[A-Z]{2})-[a-z]{2}_Text_v1_[0-9A-Z]{8}_[A-Z0-9]{14}.txt/gi;

let t = 'FDIP_en-gb-nn_Text_v1_YYYYMMDD_SequenceNumber.txt';

let dd = r.exec(t);


console.log(dd[1]);

这是组捕获的示例

查看regex 中的名称和对象破坏名称匹配。

const { groups: { language } } = /FDIP_(?<language>[a-z]{2}-[A-Z]{2})-[a-z]{2}_Text_v1_[0-9A-Z]{8}_[A-Z0-9]{14}.txt/gi.exec('FDIP_en-gb-nn_Text_v1_YYYYMMDD_SequenceNumber.txt');

console.log(language);

【讨论】:

  • 最好准确地解释您所做的更改.. 否则您会期望人们通过冗长的正则表达式搜索微小的更改(在这种情况下移动单个 ) 字符)跨度>
  • @freefaller 感谢您的指出。我已经添加了解释。如果遗漏了什么,请告诉我。
  • 感谢您的反馈,如果按照说明加载多种类型的文件名,我会创建一个 r 所在的数组
  • 如果要匹配多行,可以在正则表达式中使用多行标志m
【解决方案2】:

要解决您的问题,您应该:

  • 修复您的正则表达式:
FDIP_([a-z]{2}-[A-Z]{2}-[a-z]{2})_Text_v1_[0-9]{8}_[0-9]{14}.txt
// to
FDIP_([a-z]{2}-[a-z]{2})-[a-z]{2}_Text_v1_[0-9]{8}_[0-9]{14}.txt
  • 通过regex.exec函数从first group获取值

const fileNames = [
'FDIP_en-gb-nn_Text_v1_20190101_12345678901234.txt',
'FDIP_fr-fr-nn_Text_v1_20200202_12345678901234.txt',
'FDIP_de-de-nn_Text_v1_20180808_12345678901234.txt']

const cultureNames = fileNames.map(name => {
  const matched = /FDIP_([a-z]{2}-[a-z]{2})-[a-z]{2}_Text_v1_[0-9]{8}_[0-9]{14}.txt/.exec(name)
  
  return matched && matched[1]
})

console.log(cultureNames)

【讨论】:

  • 最好准确地解释你所做的改变。否则你会期望人们通过一个长的正则表达式来寻找微小的变化(在这种情况下移动一个 ) 字符)跨度>
【解决方案3】:

更改FDIP_([a-z]{2}-[A-Z]{2}-[a-z]{2})_Text_v1_[0-9]{8}_[0-9]{14}.txt

let pattern = /FDIP_([a-z]{2}-[a-z]{2})-[a-z]{2}_Text_v1_[\w]{8}_[\w]{14}.txt/;

var str = 'FDIP_en-gb-nn_Text_v1_YYYYMMDD_SequenceNumber.txt';
console.log(str.match(pattern)[1]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 2010-11-22
    • 2015-12-25
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多