【问题标题】:Using regex to duplicate a selection and replacing some characters使用正则表达式复制选择并替换一些字符
【发布时间】:2021-05-03 14:04:47
【问题描述】:

可能是个糟糕的标题。

我正在尝试以下内容:

Joe Dane
Bob Sagget
Whitney Houston
Some
Other
Test

并试图生产:

JOE_DANE("Joe Dane"),
BOB_SAGGET("Bob Sagget"),
WHITNEY_HOUSTON("Whitney Houston"),
SOME("Some"),
OTHER("Other"),
TEST("Test"),

我正在使用 Notepad++,我很接近,但在正则表达式方面还不够好,无法找出剩余的表达式。到目前为止,这就是我所拥有的:

查找内容:(^.*)
替换为:\1 \(\"\1\"\),
产生:Joe Dane("Joe Dane"),

我已尝试替换为:\U$1 \(\"\1\"\),,但这也会影响 \1 的第二个实例(大写)。它也不会用下划线 _ 替换空格。

【问题讨论】:

  • notepadd++ 添加标签
  • 一行可以有两个以上的单词吗?有多少?

标签: regex notepad++


【解决方案1】:

这可以一步完成。


如果一行中的单词不超过 2 个:

  • Ctrl+H
  • 查找内容:^(\S+)(?: (\S+))?$
  • 替换为:\U$1(?2_$2)\E\("$0"\),
  • 检查 环绕
  • CHECK 正则表达式
  • 全部替换

说明:

^               # beginning of line
(\S+)           # group 1, 1 or more non space
(?: (\S+))?     # non capture group, a space, group 2, 1 or more non space, optional
$

替换:

\U          # uppercased
$1          # group 1
(?2_$2)     # if group 2 exists, add and underscore before
\E          # end uppercase
\("$0"\),   # the whole match with parens and quote

截图(之后):


如果您的单词超过 2 个(最多 5 个),请使用:

  • 查找^(\S+)(?: (\S+))?(?: (\S+))?(?: (\S+))?(?: (\S+))?

  • 替换:\U$1(?2_$2)(?3_$3)(?4_$4)(?5_$5)\E\("$0"\),

如果你有超过五个字,请根据需要添加尽可能多的(?: (\S+))?

【讨论】:

    【解决方案2】:

    您可以分两步完成,首先从字符串的开头匹配任何字符 1 次以上。

    找到什么

    ^.+
    

    对于第一个替换,您可以使用\E 来结束\U 的激活并使用完整匹配$0

    替换为

    \U$0\E\("$0"\),
    

    第二步,用下划线替换空格,你可以跳过括号之间的文本,匹配大写字符之间的空格。

    找到什么

    \(".*?"\)(*SKIP)(*F)|[A-Z]+\K\h+(?=[A-Z])
    
    • \(".*?"\) 匹配从 ("")
    • (*SKIP)(*F)|跳过这部分比赛
    • [A-Z]+\K 匹配大写字符并使用\K 清除当前匹配缓冲区(忘记匹配的内容)
    • \h+(?=[A-Z]) 匹配 1+ 个水平空白字符并在右侧断言一个大写字符

    替换为 _

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多