【问题标题】:RegExp - If first part of search string is found then replace with the full search string valueRegEx - 如果找到搜索字符串的第一部分,则替换为完整的搜索字符串值
【发布时间】:2014-02-08 11:30:32
【问题描述】:

是否有正则表达式可以根据条件查找和替换值,“如果搜索字符串的第一部分在目标字符串中,则替换与搜索字符串匹配的部分。”

这是一种特殊的搜索和替换,因为替换也用作搜索字符串。

例如,我有这个网址:

http://www.domain.com/path/something/more/something/

搜索以下任何部分并替换为整体:

/path/user/

由于“/path/”同时在替换字符串和目标字符串中,结果将是:

http://www.domain.com/path/user/something/more/something/

注意:搜索/替换值可以是任何值。

在我进行替换时,我不知道替换和搜索字符串是什么,所以我不能使用硬编码搜索字符串的东西。例如,这不起作用,因为术语是硬编码的:

s.replace(/(\/path\/)/, "$1value/");

另一个例子:
这是句子,“谢谢苏珊您的订单。” 这是搜索和替换,“Susan Summers” 这是所需的句子,“谢谢 Susan Summers 的订单。”

用例:
假设您有 100 万个文本文档,它们是给客户的信件,但是当他们创建文档时,他们仅在应该使用全名时才使用客户的名字。现在,您的工作是查找并用他们的全名替换每次出现的名字。你只有他们的全名才能使用,而不是名字。

刚刚意识到这可能无法用作 RegEx,并且可能需要代码。

【问题讨论】:

  • 当您说“搜索以下任何 部分 并替换为整体”时 - 什么构成 部分?使用您的示例 URL 和 /path/user/,我们不能说 / 是在目标字符串中找到的搜索字符串的一部分,因此结果可能是:http:/path/user//path/user/www.domain.com/path/user/path/path/user/user...?那么,“part”是指与目标字符串匹配的搜索字符串的最大可能部分吗?或者你的意思是一个或多个用括号完全封装的字符串(如/path//path/user/)?
  • 第一次出现。我添加了更多示例和用例。
  • 抱歉继续澄清问题。当您说“第一次出现”时,我会假设这意味着您的搜索字符串中与目标字符串匹配的最短字符串。在您的示例中,那将是 S 而不是 `Susan`。因此,结果将是“谢谢 Susan Summersusan 的订单......
  • 如果名字是Susim,由于前3个字母匹配,是否仍应替换"Susan Summers"
  • 好问题。我认为它应该取决于第一个非字母字符。所以任何不是字母的字符。例子是“。”或“”或“,”等

标签: javascript regex actionscript-3


【解决方案1】:

你可以使用:

s = 'http://www.domain.com/path/something/more/something/';
r = s.replace(/(\/path\/)/, "$user/");
//=> "http://www.domain.com/path/user/something/more/something/"

【讨论】:

  • 抱歉,搜索字符串可能是也可能不是“/path/”。条件是“如果搜索字符串的任何部分在目标字符串中,则将匹配的部分替换为搜索字符串。”我会更新问题。
  • 是的。又添加了一些。
【解决方案2】:

这种情况不需要使用正则表达式:

var url = 'http://www.domain.com/path/something/more/something/';
url.replace('/path/', '/path/user/');
// => "http://www.domain.com/path/user/something/more/something/"

【讨论】:

  • 但它也会将/paths替换为/users
  • @anubhava,你是对的。我更新了代码(附加了一个尾随/)。谢谢。
【解决方案3】:

我不太确定我是否正确理解了这个问题。以下内容将 /path/user/ 的任何部分(-> 第 1 部分:'path',第 2 部分:'user')替换为整个 /path/user:

var url1 = "http://www.domain.com/path/something/more/something/";
var url2 = "http://www.domain.com/user/something/more/something/";
url1.replace(/\/path\/|\/user\//, '/path/user/');
url2.replace(/\/path\/|\/user\//, '/path/user/');

结果:

http://www.domain.com/path/user/something/more/something/
http://www.domain.com/path/user/something/more/something/

我希望这是你需要的,否则,请添加另一个示例。

编辑:

下面是正则表达式:http://regex101.com/r/jL6tK6

【讨论】:

    【解决方案4】:

    split + join 替代方案:

    url = url.split('/path/').join('/path/user/');
    

    虽然您的要求并不清楚,但这里有一个猜测,会引发一些额外的问题:

    var sub = '/path/user/';
    var parts = sub.match(/[^\/]+/g);
    url = url.replace(new RegExp(
        '\\/(' + [parts.join('\\/')].concat(parts).join('|') + ')\\/'
    ), sub);
    

    生成的正则表达式如下:

    /\/(path\/user|path|user)\// // "/path/user/" OR "/path/" OR "/user/"
    

    假设我们生活在世界上最好的地方,让我们检查一些网址:

    'http://domain/'         -> 'http://domain/'
    'http://path/user/'      -> 'http://path/user/'
    'http://path/'           -> 'http://path/user/'
    'http://user/'           -> 'http://path/user/'
    

    现在,你怎么看下面的?

    'http://path/user'       -> 'http://path/user/user'
    'http://user/path/'      -> 'http://path/user/path/'
    'http://path/user/path/' -> 'http://path/user/path/'
    

    剩下的问题是:

    • 这是您要找的吗?
    • 没有斜线怎么办?
    • 逆序情况怎么办?
    • 如何处理重复部分?

    【讨论】:

    • 抱歉,我需要动态搜索字符串并基于替换值。我更新了问题。
    • @1.21gigawatts 已更新。
    • 我添加了一个新示例和用例。在这种情况下,这将是第一次出现,因为我试图更改 URL 中的路径。 PS 漂亮的头像图标。
    • @1.21gigawatts 谢谢:D 你说“在这种情况下”,但有 3 个案例暴露。您能否像我一样(input -> output)一一澄清每一点?那会很有帮助:)
    • 在“...两全其美”中,除了最后一个之外,所有结果都是需要的。最后一个应保留为输入。另外,请注意原始帖子中带有名字用例的新示例。您已经考虑了名字和姓氏也可能存在的条件。
    猜你喜欢
    • 2016-01-19
    • 2020-01-06
    • 1970-01-01
    • 2023-02-02
    • 2010-11-14
    • 1970-01-01
    • 2014-02-23
    相关资源
    最近更新 更多