匹配重复字的可变计数

时间:2016-10-24 11:23:12

标签: regex

(我正在费力地踩踏这些以使我的想法井然有序。跳到最后来回答这个问题!)

我的输入(文件名)是这样的

word1.word2.word3.e01S01.word4.word5.ext
word1.word2.E03s04.word3.ext
word1.e24s02.ext

(任何数量的单词可以在ExxSxx之前或之后; xx是00-99,E和S是常数,但可以是大写或小写;总是分机,但它是变量alpha。)

我希望这些例子的输出:

Word1 Word2 Word3 E01S01.ext
Word1 Word2 E03S04.ext
Word1 E24S02.ext

(保留ExxSxx之前和之后的所有单词;。用空格替换;单词用标题表示; E和S大写; ExxSxx和.ext之间的单词被丢弃; ext附加不变。)

我可以匹配已知的重复次数(此处为2)。使用此正则表达式(匹配1个或多个不是。的实例,直到一个点):

[^\.]+\.

我可以像这样分组,以便能够参考我想要提取的内容:

^([^\.]+)\.                so \u$1 gives Word1

我可以重复2次:

^([^\.]+)\.([^\.]+)\.      so \u$1 \u$2 gives Word1 Word2

我可以继续:

^([^\.]+)\.([^\.]+)\.([eE][0-9]{2}[sS][0-9]{2})
                          so \u$1 \u$2 \U$3 gives Word1 Word2 ExxSxx

然后我跳过剩下的并抓住.ext:

^([^\.]+)\.([^\.]+)\.([eE][0-9]{2}[sS][0-9]{2}).*(\.[a-z]{3}$)
                          so \u$1 \u$2 \U$3\L$4 gives Word1 Word2 ExxSxx.ext

最后,这是我的问题:

如果没有明确重复前x个单词的模式,我可以用任意数量的。分隔单词得到我想要的内容吗?将所有内容包括在内并包括已知的ExxSxx以及.ext以及随后处理大写后更好吗?

1 个答案:

答案 0 :(得分:0)

哦,伙计,这是一个艰难的人。你不能用一块正则表达式一次捕获一条整线来做到这一点,我很清楚(不幸的是),但如果你这样做的话,你可以一块一块地处理它:

(?:([eE]\d\d[sS]\d\d).*(\.ext)|\b(\w)([^.]*)\.)

说明:

(?:                                              // -Case 1- (non-capturing group)
   ([eE]\d\d[sS]\d\d)                            // Capture the e01S01 bit as \1
                     .*                          // Anything at all up until...
                       (\.ext)                   // ... The extension! (Capture as \2)
                              |                  // -Case 2-
                               \b(\w)            // Word boundary, then a word character (Capture as \3)
                                     ([^.]*)     // The rest of the word (Capture as \4)
                                            \.)  // The dot

并替换为:

\U\3\L\4\U\1\L\2 \E

说明:

\U\3                  // (Case 2) Uppercase the first letter of the first word
    \L\4              // Lowercase the rest of the word
        \U\1          // (Case 1) Uppercase the E01S01 bit.
            \L\2 \E   // Lowercase the extension, add a space, and end the enforced case (for good measure)

示例:https://regex101.com/r/oHpXXS/3

基本上它会逐个解决每个部分,直到它完成整个事情。 4个捕获组中只有2个将被使用 - 案例1中为\3\4,案例2中为\1\2。其他捕获组将为空,因此决心不做任何事。

问题:

每个条目末尾都有一个尾随空格。没有关于如何让它消失的想法。