【问题标题】:regular expression to match special characters between delimiters正则表达式匹配分隔符之间的特殊字符
【发布时间】:2017-02-16 01:12:15
【问题描述】:

我有一个基本字符串,希望只在括号之间获取特定字符

基本字符串:这是一个测试字符串[或多或少]

正则表达式:捕获所有 r 和 e 的作品就好了。

(r|e) 

=> 这是estring [more or l ess]

现在我想使用以下正则表达式并将其与我的正则表达式分组,以便在括号之间仅给出 r 和 e,但不幸的是这不起作用:

\[(r|e)\]

预期结果应该是:more or less

谁能解释一下?

编辑:问题与这个问题非常相似:Regular Expression to find a string included between two characters while EXCLUDING the delimiters

但不同的是,我不想将整个字符串放在括号之间。

跟进问题

base string = 'this is a link:/en/test/äpfel/öhr[MyLink_with_äöü] BREAK äöü is now allowed'

我需要一个正则表达式来查找非 ascii 字符 äöü 以替换它们,但仅限于以单词 link: 开头并以 ] 字符结尾的 link:...] 子字符串。

结果字符串将如下所示:

result string = 'this is a link:/en/test/apfel/ohr[MyLink_with_aou] BREAK äöü is now allowed again'

来自 cmets 解决方案的正则表达式 /[äöü]+(?=[^\]\[]*])/g 仅在两个括号之间传递 äöü 字符。

我知道在正则表达式中有一个带有字符列表的前瞻性,但我想知道为什么这个不起作用:

/link:([äöü]+(?=[^\]\[]*])/

谢谢

【问题讨论】:

  • 定义“不起作用”。
  • "预期结果应该是:more or less"目前尚不清楚你的意思是什么。您是指一次调用exec 的结果吗?循环?
  • 它根本不匹配。我正在使用这个正则表达式来替换给定字符串的所有 r 和 e。第一个适用于整个字符串。但是第二个只能在括号之间替换是行不通的。使用 regex101.com 进行检查会得到:'您的正则表达式与主题字符串不匹配。'
  • 由于在 JS 正则表达式中没有类似 PCRE 的(*SKIP)(?!) 也没有无限宽度的lookbehind 支持,您可以使用通常的hack - /[re]+(?=[^\][]*])/g。如果您需要更高的精度,请匹配 /\[[^\][]*]/g,然后仅在匹配项中对 es 和 rs 执行您需要的操作。
  • 您对 JS 中的正则表达式期望过高。别。如果没有详细说明您需要做什么,进一步聊天是没有意义的。

标签: javascript regex


【解决方案1】:

您可以使用以下解决方案:匹配 link:] 之间的所有字符,并仅在替换回调方法中替换匹配的子字符串内的字符:

var hashmap = {"ä":"a", "ö":"o", "ü":"u"};
var s = 'this is a link:/en/test/äpfel/öhr[MyLink_with_äöü] BREAK äöü is now allowed';
var res = s.replace(/\blink:[^\]]*/g, function(m) {  // m = link:/en/test/äpfel/öhr[MyLink_with_äöü]
  return m.replace(/[äöü]/g, function(n) { // n = ä, then ö, then ü, 
    return hashmap[n];                     // each time replaced with the hashmap value
  });
});
console.log(res);

图案细节

  • \b - 前导词边界
  • link: - 整个单词 link 后面是 :
  • [^\]]* - 除了] 之外的零个或多个字符([^...] 是一个否定字符类,它匹配除其中定义的字符/字符范围之外的任何字符/字符范围)。李>

另外,请参阅Efficiently replace all accented characters in a string?

【讨论】:

  • 这是给定后续问题的解决方案。非常感谢+1
  • 实际上,我认为这是您真正需要的,因为最初的问题是 XY 问题。
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
相关资源
最近更新 更多