【问题标题】:How can I capture a specific char inside specific strings with regex?如何使用正则表达式捕获特定字符串中的特定字符?
【发布时间】:2022-01-17 01:42:46
【问题描述】:

我想用下划线替换所有在特定字符串中的点。就我而言,我在我的应用程序中使用 i18n(用于翻译),并且使用“$t(key)”调用键。 键可以是这样的:

key = 'translationKey'
key = 'translationKey.subkey.subSubkey'
key = 'translationKey.subkey.one'
key = 'translationKey.subkey.zero'
key = 'translationKey.subkey.others'

在 $t 上下文中:我想将后面没有 onezeroothers 的点 (.) 转换为下划线 (_)。如果我有这些输入:

foo.toto.anything
$t('translationKey')
$t('translationKey.subkey.subSubkey')
$t('translationKey.subkey.one')
$t('translationKey.subkey.zero')
$t('translationKey.subkey.others')

那么输出将是:

foo.toto.anything
$t('translationKey')
$t('translationKey_subkey_subSubkey')
$t('translationKey_subkey.one')
$t('translationKey_subkey.zero')
$t('translationKey_subkey.others')

我想使用 Vscode 正则表达式搜索来捕获这些点并替换它们(如果可能的话)。

我只设法获得了目标点所在的所有字符串,但我不能只到达这些点。这是我的正则表达式:(\$|\.)t?t(c|p)?('(\w+\.?)*')

谢谢

【问题讨论】:

  • 你试过了吗?
  • @depperm 实际上我被卡住了,因为我只设法获得了目标点所在的所有字符串,但我不能只到达这些点。这是我的正则表达式: (\$|\.)t?t(c|p)?('(\w+\.?)*')
  • @K450 谢谢你,但是这样你就可以捕捉到所有其他的点。不仅是 $t(translationKey.subKey.etc); 中的那些;
  • 使用(?<=\$t\('[^']*)\.(?!(?:one|zero|others)')(?=[^']*'\))。请将您使用的正则表达式添加到问题正文中。
  • 也许你会喜欢.replace(/\b\.(?!one|zero|other|$)/g,"_")

标签: javascript regex visual-studio-code


【解决方案1】:

你可以使用

(?<=\$t\('[^']*)\.(?!(?:one|zero|others)')(?=[^']*'\))

请参阅regex demo详情

  • (?&lt;=\$t\('[^']*) - 需要$t(' 的正向回溯,然后在当前位置左侧紧邻' 以外的任何零个或多个字符
  • \. - 一个点
  • (?!(?:one|zero|others)') - 如果在当前位置的右侧有 one'zero'others',则匹配失败
  • (?=[^']*'\)) - 需要零个或多个字符而不是 '') 的正向前瞻。

【讨论】:

  • 这按预期工作:D。但是在vscode中我遇到了一个问题。虽然它适用于本地搜索,但不适用于全局搜索。我有下一条消息:“lookbehind assertion is not fixed length”。所以我想我将使用您的正则表达式实现递归查找和替换:' (
  • @Kalukalu 文件搜索功能使用 Rust 正则表达式引擎,它不支持环视。 Lookarounds 只能在文档内搜索和替换工具中使用。
【解决方案2】:

下面的正则表达式应该可以工作:它匹配所有不跟随“one”、“others”和“zero”的点

(?<=\$t\('[^']+)\.(?!one|others|zero)

你可以在这里在线测试

https://regex101.com/r/84Jil1/1

【讨论】:

  • 谢谢你,但这抓住了所有的点。不仅是 $t 上下文中的那些。例如,如果您执行 foo.to.hello。您的答案也将捕获它。我会更新问题以使其更清楚
  • @Kalukalu,明白了:我更新了答案
猜你喜欢
  • 2023-01-17
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 2023-01-05
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2021-09-06
相关资源
最近更新 更多