【问题标题】:How can I get the first and last part of one wordcombination using regex如何使用正则表达式获取一个单词组合的第一部分和最后一部分
【发布时间】:2021-12-18 02:02:20
【问题描述】:

如何使用 PCRE 正则表达式仅获取组合名称的中间部分?

姓名:211103_TV_storyname_TYPE

结果:storyname

我已经使用了这一行:.(\d)+.(_TV_) 删除了第一部分:211103_TV_

另一个想法是使用(_TYPE)$,但问题是我在所有名称的变体中都没有空格来声明第二个单词以使用 ^ 表示第一个单词,$ 表示第二个单词。

组合名称的变体适用于 _TYPE 和 TV。 数字根据日期而变化。故事名称是可变的。 有什么想法吗?

谢谢

【问题讨论】:

  • [^_]+(?=_[^_]+$) Demo

标签: regex pcre


【解决方案1】:

对于您显示的示例,请尝试以下正则表达式,这将创建一个包含匹配值的捕获组。

.*?_TV_([^_]*)(?=_TYPE)

(在上面的解决方案中添加一个小变化和第四只鸟的好建议),下面是没有惰性匹配.*? 与上面不同:

_TV_([^_]*)(?=_TYPE)

Here is the Online demo for above regex

说明:为上述添加详细说明。

.*?_      ##Using Lazy match to match till 1st occurrence of _ here.
TV_       ##Matching TV_ here.
([^_]*)   ##Creating 1st capturing group which has everything before next occurrence of _ here.
(?=_TYPE) ##Making sure previous values are followed by _TYPE here.

【讨论】:

  • 您好,感谢您的代码。我使用了这个 sn-p:.*?_TV_([^_]*)(?=_TYPE) 作为名称 211102_TV_UTHERK_TYPE 结果是我使用 PCRE 的工具:UTHERK_TYPE 有什么建议吗?谢谢
  • @datoby,好的,用一次_TV_([^_]*)(?=_TYPE) 怎么样?
  • 211102_TV_UTHERK_TYPE_TV_([^_]*)(?=_TYPE) 和目标模式:$4 211102_TYPE 与目标模式:$1 211102UTHERK_TYPE 与目标模式:$5 211102_TYPE 是较旧的工具。仅获取故事名称的另一个想法?
【解决方案2】:

您可以尽可能少地匹配_TV_ 之后的字符,直到匹配_TYPE

\d_TV_\K.*?(?=_TYPE)
  • \d_TV_ 匹配一个数字和_TV_
  • \K 忘记匹配到现在的内容
  • .*? 匹配尽可能少的字符
  • (?=_TYPE) 向右断言_TYPE

Regex demo

另一个没有非贪婪量词的选项,并且在开头省略了数字:

_TV_\K[^_]*+(?>_(?!TYPE)[^_]*)*(?=_TYPE)
  • _TV_ 字面匹配
  • \K[^_]*+ 忘记到目前为止匹配的内容,并可选择匹配除_ 之外的任何字符
  • (?>_(?!TYPE)[^_]*)* 只允许匹配 _ 不直接跟在 TYPE 之后
  • (?=_TYPE) 向右断言_TYPE

Regex demo


编辑

如果你想替换这两个部分,你可以使用一个交替并用一个空字符串替换。

如果它应该在字符串的开头和结尾,您可以在模式前面加上^$

\b\d{6}_TV_|_TYPE\b
  • \b\d{6}_TV_一个字边界,匹配6位数字和_TV_
  • |或者
  • _TYPE\b 匹配 _TYPE 后跟单词边界

Regex demo

【讨论】:

  • 你需要\d吗?
  • @Djave 要获得相同的输出,您可以省略它。 Is 是 OP 尝试的模式的一部分,这就是为什么左匹配单个数字的原因。您也可以写 \b\d{6}_TV_\K.*?(?=_TYPE) 这取决于模式的具体程度。
  • 啊,是的,对不起,你说的很对。
  • 您好,感谢您的选择。使用正则表达式它工作正常。但是我的工具在旧版本中使用 PCRE。我用_TV_\K[^_]*+(?>_(?!TYPE)[^_]*)*(?=_TYPE) 作为名称:211104_TV_STJHEU_TYPE 结果是:211104_TV__TYPE 我怎样才能得到与结果相反的结果?
  • @datoby 这个工具叫什么名字?这看起来像是一个奇怪的匹配,因为这个字符串 211104_TV__TYPE 不是 211104_TV_STJHEU_TYPE 的一部分我认为你用空字符串替换匹配正确吗?
【解决方案3】:

在这里,我在帖子中添加了一些额外的屏幕截图。使用帮助按钮上显示的文档。你会看到表格和我看到的。

文档

我们使用的正则表达式基于 PCRE - Perl Compatible Regular Expressions。完整的规范可以在这里找到:http://www.pcere.orghttp://perldoc.perl.org/perlre.html

一些有用术语的总结:


元字符


\ Quote the  next  metacharacter 
^ Match the  beginning  of  the  line 
. Match  any  character  (except  newline) 
$  Match  the  end  of  the  line  (or  before  newline  at  the  end) 
|  Alternation 
()  Grouping 
[]  Character  class 

量词


*  Match  0 or more times
+  Match  1 or more times
?  Match 1 or 0  times 
{n} Match exactly n times 
{n,}  Match  at  least  n  times 
{n,m}  Match  at  least  n  but  not  more  than  m  times

字符类


\w  Match  a  "word"  character  (alphanumeric  plus  mao} 
\W  Match  a  non-"word"  character 
\s  Match  a  whitespace  character 
\S  Match  a  non-whitespace  character 
\d  Match  a  digit  character 
\D  Match  a  non-digit  character 

捕获缓冲区


括号结构 (...) 创建捕获缓冲区。参考 在同一模式中,第一个使用 \1,第二个使用 \2,依此类推。在比赛之外使用“$”而不是“”。 \ 符号在匹配之外的某些情况下有效。有关详细信息,请参阅下面关于 \1 与 $1 的警告。 引用匹配的另一部分称为反向引用。


例子


用某些前缀字母 M N 或 E 替换故事以具有前缀“AA”:

`srcPattern  "(M|N|E  )  ([A-Za-z0-9\s]*)"`
`trgPattern  "AA$2"   `

`"N StoryWord1 StoryWord2" -> "AA StoryWord1 StoryWord2"`
`"E StoryWord1 StoryWord2" -> "AA StoryWord1 StoryWord2"`
`"M StoryWord1 StoryWord2" -> "AA StoryWord1 StoryWord2"`

"NoMatchWord StoryWord1 StoryWord2" -> "NoMatchWord StoryWord1 StoryWord2"(未找到匹配项,名称保持不变)

【讨论】:

  • 如果您将前两张图片作为文本发布,那将是一个很大的改进
  • 已更新文档的文本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
  • 2016-08-10
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
相关资源
最近更新 更多