(我正在费力地踩踏这些以使我的想法井然有序。跳到最后来回答这个问题!)
我的输入(文件名)是这样的
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以及随后处理大写后更好吗?
答案 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
。其他捕获组将为空,因此决心不做任何事。
每个条目末尾都有一个尾随空格。没有关于如何让它消失的想法。