簡體   English   中英

Javascript —正則表達式—多個單詞的黑名單,以部分匹配結束

[英]Javascript — Regex — Blacklist of multiple words to END with a partial match

我已經閱讀了關於StackOverflow的許多問題,包括這個問題, 這個問題 ,甚至閱讀了Rexegg的最佳技巧 ,這也是這里的一個問題。 我找到了這個 ,它可以用在所有行上,但是不能“解決所有壞詞”。 這些都沒有幫助我,所以我去:

Javascript中 ,我有一個很長的正則表達式模式。 我正在嘗試匹配類似句子結構中的序列,如下所示:

1 UniquePrefixA [some-token]和[some-token]想要帶[some-token]看一些猴子。

2 UniqueC [some-token]想要帶[some-token]到商店。 UniqueB,[some-token]再次出現在模式中。

3 UniquePrefixA [some-token]使用[some-token]到[some-token]。

請注意,每個模式都以唯一的前綴開頭。 遇到該前綴表示模式開始。 如果在捕獲過程中再次遇到該模式,則不應捕獲第二個事件,然后停止。 我將捕獲到該前綴之前的所有內容。

如果在模式的后面沒有遇到前綴,則需要繼續匹配該模式。

我也在使用捕獲組(不再重復,因為捕獲組僅返回該組的最后一個匹配項)。 捕獲組的內容需要返回,因此我使用的是非貪婪的匹配。

這是我的模式和工作示例

/(?:UniquePrefixA|UniqueB|UniqueC)\s*(\[some-token\])(?:and|\s)*(\[some-token\])?(\s|[^\[\]])*(\[some-token\])? --->(\s|[^\[\]])*<--- (\[some-token\])?(\s|[^\[\]])*/i

基本上是按特定順序的2種重復模式:

(\s|[^\[\]])*     // Basicaly .*, but excluding brackets
(\[some-token\])  // A token [some-token]

我怎樣才能使比賽持續過去的話的黑名單?

我希望這種情況在我畫三個箭頭的情況下發生。 等效於Any字符,但不包括此列表的內容:(UniquePrefixA | UniqueB | UniqueC)(在捕獲組1中看到)。

我可能需要更好地了解負面的前瞻性,或者它是否可以處理一組問題。 最重要的是,我想知道否定的前瞻性方法是否可以支持一系列選項?或者是否有更好的方法? 如果答案是“你做不到”,那也很酷。

我認為,更易於維護的解決方案是將您的任務分為兩部分:

  1. 查找從您的任何唯一前綴開始的每個文本 ,直到字符串的下一個或結尾。

  2. 處理每個這樣的塊,尋找您的一些令牌,以及它們之間的內容。

執行第一個任務的正則表達式應包括3個部分:

  • (?:UniquePrefixA|UniqueB|UniqueC) -尋找任何唯一前綴的非捕獲組。
  • ((?:.|\\n)+?) -一個捕獲組-要捕獲以進行進一步處理的片段(請參見下面的注釋)。
  • (?=UniquePrefixA|UniqueB|UniqueC|$) -正向超前,查找字符串的任何唯一前綴或結尾(您要查找的停止條件 )。

綜上所述,整個正則表達式如下所示:

/(?:UniquePrefixA|UniqueB|UniqueC)((?:.|\n)+?)(?=UniquePrefixA|UniqueB|UniqueC|$)/gi

注意:不幸的是,正則表達式的JavaScript風格沒有實現單行-s )選項。 因此,不僅僅是. 在上面的捕獲組中,必須使用(?:.|\\n) ,表示:

  • \\n. )以外的任何字符,
  • 或只是\\n

由於重復標記( +? )與兩個變體有關,因此將這兩個變體“包圍”到一個非捕獲組中,以限制變體( |兩面)。

注意? +之后,表示不願意使用的版本。

因此,正則表達式的這一部分(捕獲組)將匹配任何字符序列, 包括 \\n ,如您所料,在下一個uniqie前綴(如果有)之前結束。

第二項任務是將另一個正則表達式應用於捕獲的塊(組1),尋找[some-token]和它們之間的內容。 您沒有指定每個塊到底要做什么,所以我不確定第二個正則表達式應該包含什么。 也許只要匹配[some-token] to [some-token]就足夠了?

為了確保模式不會出現在重復字符序列中,例如(\\s|[^\\[\\]])* ,請注意, \\s包含在[^\\[\\]]因此可能只是[^\\[\\]]* ,是在重復模式的左側和內部添加一個否定的超前查詢(類似於^ lentgh匹配斷言為零),以便對每個字符進行檢查:

((?!UniquePrefixA)(\s|[^\[\]]))*

暫無
暫無

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

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