我想找到一個正則運算式(最好在 perl 中,但任何風格都可以)來替換_除前面正好 8 位數字和后面正好 6 位數字之外的每個。
實際上,我想_用 format 替換檔案名,但日期中的檔案名除外YYYYMMDD_hhmmss。
一般來說,我想替換某些字符的每次出現,這些字符前面沒有某個模式 , 后面沒有另一個模式。
我嘗試了很多正則運算式并在網上尋找很多,但我沒有找到任何東西!
我知道可以替換 every _by .,然后恢復_in YYYYMMDD.hhmmss,但我有興趣一步一步完成(希望有可能)。
以下是一些替換示例:
Patate_17890505_TitreEnCamelCase.ext --> Patate.17890505.TitreEnCamelCase.ext
EPFL_AlgebreLineaire --> EPFL.AlgebreLineaire
ipe.20210302_005606.pdf --> ipe.20210302_005606.pdf
1_ --> 1.
12_ --> 12.
_1 --> .1
_12 --> .12
12345678_ --> 12345678.
_123456 --> .123456
12345678_12345 --> 12345678.12345
1234567_123456 --> 1234567.123456
1234567_12345 --> 1234567.12345
123456_12345 --> 123456.12345
12345678_1234567 --> 12345678.1234567
123456789_123456 --> 123456789.123456
123456789_1234567 --> 123456789.1234567
_patate__truc__ --> .patate..truc..
___ --> ...
foo_12345678 --> foo.12345678
foo_12345678_123456_bar --> foo.12345678_123456.bar
12345678_123456 --> 12345678_123456
foo12345678_123456bar --> foo12345678_123456bar
下面,我嘗試了幾個例子。
與我想要的完全相反,即替換 every_前面正好 8 位數字,后面跟著正好 6 位數字(在regex101上試試):
s/((?<!\d)(?:\d{8}))_((?:\d{6})(?!\d))/$1.$2/g
它有效,所以我需要這個正則運算式的否定......
只是一個消極的lookbehind和一個消極的lookahead(在regex101上試試):
s/(?<!\d{8})_(?!\d{6})/./g
失敗:如果_前面正好有 8 位數字或后面正好有 6 位數字,則不替換,例如,_在這些字串中不替換:
12345678_
_123456
12345678_12345
1234567_123456
我需要替換所有,除了“and”,但是這個替換了所有,除了“or”(所以它錯過了一些_)。
受此答案的啟發(來自python regex: match a char 被正好 2 個 chars 包圍)(在regex101上嘗試):
s/(?<!(?<!\d)\d{8})_(?!\d{6}(?!\d))/./g
失敗:與上一個原因相同。
原始答案中的正則運算式有效,因為它替換了前面有 pre-pattern 和 后跟 post-pattern 的字符。
受此答案的啟發(來自Replace character UNLESS 被特定標簽包圍),但我不太明白它是如何作業的(在regex101上嘗試):
s/_(?:(?!(?:.*?\d{6}))|(?=[^\d] \d{8}))/./g
失敗:在這些示例中,_未替換
_123456
1234567_123456
12345678_1234567
123456789_123456
123456789_1234567
foo_12345678
原來的問題和我的很接近,但是 pre-pattern 和 post-pattern 不是\d{8}and \d{6},而是 HTML 標簽,所以問題更容易:<tag>并且</tag>是獨特的元素,對于我的問題,post-pattern\d{6}后面可以跟一個其他數字(同樣,預模式\d{8}可以在其他數字之前)。
但是這個幾乎可以作業,與之前的嘗試不同,它替換了_這兩個字串中的:
12345678_
12345678_12345
所以也許修改可以使它按我的意愿作業……
uj5u.com熱心網友回復:
您可以使用
(?<!\d)\d{8}_\d{6}(?!\d)(*SKIP)(*F)|_
請參閱正則運算式演示。詳情:
(?<!\d)\d{8}_\d{6}(?!\d)- 八位數字,_以及不包含任何其他數字的六位數字(*SKIP)(*F)- 在當前位置失敗匹配并從失敗位置繼續正則運算式搜索|- 或者_- 任何其他背景關系中的下劃線。
另一種正則運算式是
_(?!(?<=(?<!\d)\d{8}_)\d{6}(?!\d))
請參閱此正則運算式演示。詳情:
_- 一個下劃線(?!(?<=(?<!\d)\d{8}_)\d{6}(?!\d))- 如果 - 緊接在當前位置的右側 - 有六個(且不超過六個)數字緊接在八個數字和一個下劃線之前,則匹配失敗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/464653.html
