簡體   English   中英

帶點括號,正則表達式

[英]Brackets with dot, regular expressions

我想刪除以字符串中的點結尾的剎車。 我使用常規表達式- @"\\([^)]+\\)\\." 它適用於這樣的字符串- some text (some text) some (text). ,在正則表達式之后,我得到了字符串- some text (some text) some但是這不適用於這樣的字符串- some text (some text) some (text (text) some). 如何解決?

“如何解決?” 傳統答案:您不能。 正則表達式不支持休息結構。 對於大多數正則表達式來說都是如此。


但是.NET正則表達式引擎支持平衡組 使用它們,您可以識別和處理嵌套。

要處理嵌套結構,必須定義其打開和關閉模式,在這種情況下,分別是括號()

  • 打開: (?<paren>\\()
  • 關閉: (?<-paren>\\))

可以將其視為一種名為“ paren”的計數器,該計數器在遇到時遞增計數(遇到時遞減計數) (內部有點不同,但是作為一個隱喻,這就足夠了)。

現在,可以使用這兩個定義括號的內容,即

  • 除括號外的任何內容: [^()]*
  • 或開放模式
  • 或從上方關閉模式

或在一個表達式中: (?:[^()]*|(?<paren>\\()|(?<-paren>\\)))+

當計數器的末尾不為零(即括號不平衡)時,整個正則表達式將失敗。 為此,使用(?(paren)(?!))構造(這是一個有條件的 ,旨在在paren不匹配時失敗。

完成的表達式如下所示(忽略空格)

\(
  (?:
    [^()]*
    |(?<paren>\()
    |(?<-paren>\))
  )+
  (?(paren)(?!))
\)\.$

現場觀看: http//regexhero.net/tester/? id = feb992a2-cc5d-497a-9d4a-a10317487e46

推薦閱讀:

只需如下更改您的正則表達式,以匹配以結尾的括號.

@"\((?:[^()]*\([^()]*\))*[^()]*\)\."

演示

正則表達式:

\(                       '('
(?:                      group, but do not capture (0 or more
                         times):
  [^()]*                   any character except: '(', ')' (0 or
                           more times)
  \(                       '('
  [^()]*                   any character except: '(', ')' (0 or
                           more times)
  \)                       ')'
)*                       end of grouping
[^()]*                   any character except: '(', ')' (0 or more
                         times)
\)                       ')'
\.                       '.'

暫無
暫無

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

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