【问题标题】:Need to extract part of a url using Regex [duplicate]需要使用正则表达式提取部分 url [重复]
【发布时间】:2020-03-19 08:12:42
【问题描述】:

我想使用 Regex 而不是字符串操作函数从 s3 URL 中提取子字符串。

我的要求是从 URL s3://s3bucket/dynamodbtablename/05abd315-2e0b-4717-919d-1cc6576ebe19 中检索 dynamodbtablename/05abd315-2e0b-4717-919d-1cc6576ebe19

但是,我无法安排正则表达式来给我想要的东西。

我希望正则表达式以这种形式解析,但我知道我在正则表达式行中遗漏了一些内容。

const url = 's3://s3bucket/dynamodbtablename/05abd315-2e0b-4717-919d-1cc6576ebe19';
const patternMatches = url.match(new RegExp(s3://${s3bucket}/${dynamodbtablename}/([a-f\d-]+)));
const migrationDataFileS3Key = patternMatches[indexOfResultingArrayWithDesiredSubstring]

我能够想出下面的表达式来检索 UUID/GUID,并且必须将其与 ${s3bucket} 连接以形成 S3 存储桶密钥。但是,我对这个解决方案不满意。我需要以上内容。

const url = 's3://s3bucket/dynamodbtablename/05abd315-2e0b-4717-919d-1cc6576ebe19';
const patternMatches = url.match(/([a-f\d-]+)/g);
const migrationDataFileS3Key = massiveTableItem + '/' + patternMatches[patternMatches.length - 1];

非常感谢您的帮助。

【问题讨论】:

  • 尝试let patternMatches = url.match(new RegExp(String.raw`s3://${s3bucket}/${dynamodbtablename}/([a-fA-F\d-]+)`));,然后patternMatches[1] 将保持05abd315-2e0b-4717-919d-1cc6576ebe19
  • @WiktorStribiżew,我相信这个问题是不同的,因为我希望答案采用的格式。对于大多数人来说,这个问题的答案也比其中的更简单、更容易理解您分享的帖子。我的问题也不应该被否决。
  • 在您尝试回答之前,我还明确指定了我的问题。如果您在一审时已通读它,那么您当时就可以提出副本,而不是在我提出仍然给您和另一个响应者信用的答案之后。

标签: javascript regex


【解决方案1】:

您可能不需要正则表达式:在 / 上拆分 URL 并从中获取您需要的元素。喜欢:

{
  console.log(`s3://s3bucket/dynamodbtablename/05abd315-2e0b-4717-919d-1cc6576ebe19`
    .split(`/`)  // split on forward slash
    .slice(-2)   // take the last 2 elements from the resulting array
    .join(`/`)   // extract it
    );     
  // alternatively
  console.log(`s3://s3bucket/dynamodbtablename/05abd315-2e0b-4717-919d-1cc6576ebe19`
    .match(/([\w\-])+/g)
    .slice(-2)
    .join(`/`)
    );
  // or (use capture groups)
  const {groups: {root, hashpath}} =
    /(?<root>s3:\/\/s3bucket\/)(?<hashpath>[\w\-\/]+)/
      	.exec(`s3://s3bucket/dynamodbtablename/05abd315-2e0b-4717-919d-1cc6576ebe19`);
  console.log(hashpath);
  // or (just substring from known index)
  const url = `s3://s3bucket/dynamodbtablename/05abd315-2e0b-4717-919d-1cc6576ebe19`;
  console.log(url.substr(url.indexOf(`/`, 5) + 1))
}

【讨论】:

  • 您好,感谢您的快速回复。但是,我必须使用正则表达式来完成。我在我的问题中注意到了这一点。第二件事是我想匹配dynamodbtablename/05abd315-2e0b-4717-919d-1cc6576ebe19 而不仅仅是UUID。
  • 好的,提供了一些正则表达式替代方案
  • 非常感谢。我很欣赏您提供的内容,但我不想要一个执行任何字符串或数组操作(即切片)的解决方案,除了索引并读取结果。
  • 这似乎适用于模板字符串,但我会在批准它作为答案之前对其进行更多测试。
  • 好吧,RegExp.matchRegExp.exec 都提供了一个数组
【解决方案2】:

您可以使用捕获组,例如

var str = "s3://s3bucket/dynamodbtablename/05abd315-2e0b-4717-919d-1cc6576ebe19"; 
var myRegexp = /s3:\/\/s3bucket\/(.*)/;
var match = myRegexp.exec(str);
console.log(match[1]);
// returns 'dynamodbtablename/05abd315-2e0b-4717-919d-1cc6576ebe19'

【讨论】:

  • 非常感谢。这行得通。我应该更详细地检查捕获组,因为它们看起来非常方便。但是,如果您要进行匹配以验证最后的 uuid/guid,就像我指出的那样,您将如何进行。你有解决方案吗?我已经将此标记为解决方案,但会感谢您对我刚刚提出的问题的回答。非常感谢。
  • 等一下,我还没有检查在这里使用模板字符串是否有效。我会检查并返回。
  • 此解决方案不适用于模板字符串变量。我已将其列为答案。
【解决方案3】:

我最终能够找到一个最接近我在问题中所要求的格式的解决方案。我可以通过结合 @sudhir-bastakoti 和 @wiktor-stribiżew 的解决方案来做到这一点,因为每个单独的答案都没有完全解决我的问题。

感谢所有回答我问题的人,包括 @kooiinc。我检查了他的最后一个答案选项,它奏效了。但是,我想要某种格式的答案。

const s3bucket = 's3bucket';
const url = 's3://s3bucket/dynamodbtablename/05abd315-2e0b-4717-919d-1cc6576ebe19';
const migrationDataFileS3Key = url.match(new RegExp(String.raw`s3://${s3bucket}/(.*)`))[1];

【讨论】:

    猜你喜欢
    • 2018-11-04
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 2014-10-18
    相关资源
    最近更新 更多