簡體   English   中英

正則表達式可查找特定的字符串並在記事本++中尚不存在時添加字符

[英]Regular expression to find specific string and add characters when the're not already there in notepad++

好的,我對正則表達式的知識為零,所以如果有人可以引導我找到一種更好的方法來解決這個問題,那么請務必這樣做。

我發現一系列文件缺少它們要寫入的數據庫的特定命名約定。 因此,其中一些可能是dbname1,dbname2,dbname3,abcdbname4,abcdbname5,並且它們都需要在開始時包含該abc。 我想編寫一個正則表達式,以查找文件中所有不立即由abc跟隨的標簽,並添加abc。 有什么想法可以做到嗎?

再次,請原諒我措辭/表達不好。 我真的對正則表達式一無所知。 我找不到任何問這個的問題。 我知道有些問題問如何在行中添加字符串,而不是僅在缺少字符串的情況下僅添加到某些行中。

我以為是我寫的,但我正在看的像這樣的線條

<Name>dbname</Name> 

要么

<Name>abcdbname</Name> 

我需要讓他們所有人在開始時都有那個abc

\\bdbname(\\d+)替換為abcdbname\\1

\\b表示“單詞邊界”,因此它與abc版本不匹配,但與其他版本匹配。 (...)括號表示捕獲組,捕獲組之間的所有匹配項都被捕獲到一個編號的變量中,以后可以引用該編號的變量(這里只有一個,因此它位於\\1 )。 \\d+匹配一個或多個數字字符。

卡梅倫的答案會奏效,但這也會奏效。 稱為負向后看。

(?<!abc)(dbname\d+)

此正則表達式查找dbname,后跟1個或多個數字,並且不帶abc前綴。 因此它將捕獲dbname113。

這將查找沒有立即用字符串“ abc”作為前綴的dbname的任何出現。 原始名稱位於捕獲組\\ 1中,因此您可以將該正則表達式替換為abc\\1並且所有文件都將正確加上前綴。

並非每個實現正則表達式的程序/語言(眾所周知,都是javascript)都支持lookbehinds,但是大多數都支持,而Notepad ++確實支持。 一旦掌握了環顧處(環顧四周/向前看),便非常方便。

?<! 負向后看, ?<=正向后看/向后看, ?! 否定的lookhead和?= lookahead都必須在括號中使用,就像我在上面所做的那樣,但是它們沒有用於捕獲,因此它們不會創建捕獲組,因此為什么第二組括號可以引用為\\ 1(或$ 1,視語言而定)

編輯:給定一些更好的示例標准,這可能是您正在尋找的更多內容。

Find: (<Name>)(.*?(?<!abc)dbname\d+)(</Name>)
Replace: \1abc\2\3

另外,您也可以執行以下操作:

Find: (<Name>)(abc)?(dbname\d+)(</Name>)
Replace: \1abc\3\4

這是做什么的:

  • 匹配<Name> ,捕獲為反向引用1。
  • 查找abc並將其捕獲(如果它作為后向引用2存在),否則2不包含任何內容。 ? 之后(abc)表示匹配0或1次。
  • 查找dbname並捕獲它。 並捕獲為反向引用3。
  • 匹配</Name> ,捕獲為反向引用4。

通過用\\ 1abc \\ 3 \\ 4替換,您可以將abcname從dbname中刪除(如果存在),然后在所有實例中都將dbname替換為abcdbname。

您可以更進一步,

Find: (<Name>)(?:abc)?(dbname\d+)(</Name>)
Replace: \1abc\2\3

abc前面加上?:前綴以創建一個非捕獲組,因此用於替換的反向引用是順序的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM