簡體   English   中英

Reg Ex在字符串的字母和數字之間添加空格字符

[英]Reg Ex Add a space character between alpha and numeric in a string

嗨,我有這種琴弦,我想獲得Like toto100成為toto 100,謝謝您的幫助

搜索

(?<=[a-zA-Z])(?=[0-9])

並用空格代替。 如果您還想拆分100toto ,請使用

(?<=[a-zA-Z])(?=[0-9])|(?<=[0-9])(?=[a-zA-Z])

此正則表達式正在尋找一個位置,緊靠字母后和數字前。 由於它不必匹配,保留和替換任何實際的文本,而只是在兩個字符之間的位置插入空格,因此速度非常快。

正如tchrist所建議的那樣,當然最好不要將自己限制為ASCII字母和數字,尤其是如果您使用的語言在正則表達式中支持Unicode(如Java)。

所以第二個正則表達式看起來像

(?<=\p{L])(?=\p{N})|(?<=\p{N})(?=\p{L})

在Java中:

String result = subject.replaceAll("(?<=\\p{L])(?=\\p{N})|(?<=\\p{N})(?=\\p{L})", " ");

要借用Tim的解決方案,但已糾正為可以處理1970年代以上的ASCII(請記住,Java字符是Unicode,因此您必須考慮這一點)提供了以下簡單解決方案:

String new = old.replaceAll("(?x) (?<= \\pL ) (?= \\pN ) | (?<= \\pN ) (?= \\pL )", " ");

這個更易於維護,更瘋狂的版本:

String new = old.replaceAll(
                "(?x)           # enable comment mode         \n"

              + " # LOOK FOR EITHER:                          \n"

              + "  (?<= \\pL )  #     a letter right behind   \n"
              + "  (?=  \\pN )  # AND a number right ahead    \n"

              + " |             #   OR ELSE                   \n"

              + "  (?<=  \\pN ) #     a number right behind   \n"
              + "  (?=   \\pL ) # AND a letter right ahead    \n"

              + "",             // placeholder so comma doesn't get lost

                " ");           // replaced with a single space

我猜你可以這樣寫,所以到目前為止還沒有縮進:

String new = old.replaceAll(
    "(?x)           # enable comment mode         \n"

  + "               # LOOK FOR EITHER:            \n"

  + "  (?<= \\pL )  #     a letter right behind   \n"
  + "  (?=  \\pN )  # AND a number right ahead    \n"

  + " |             #   OR ELSE                   \n"

  + "  (?<= \\pN )  #     a number right behind   \n"
  + "  (?=  \\pL )  # AND a letter right ahead    \n"

  + "",             // placeholder so comma doesn't get lost

  " ");             // replaced with a single space

考慮到Java對這種工作的嚴重程度 ,這可能是您將要做的最好的事情。 如果您只使用過Java,那么您甚至可能根本不知道它到底有多討厭。 相比之下,在實際上考慮到正則表達式的語言中,相同的操作是什么樣的:

($new = $old) =~ s{  # LOOK FOR EITHER:
    (?<= \pL )       #      a letter right behind
    (?=  \pN )       #  AND a number right ahead
  |                  # OR ELSE:    
    (?<= \pN )       #      a number right behind
    (?=  \pL )       #  AND a letter right ahead
}{ }xg;              # THEN insert a single space

看到所有很多很多重要的區別嗎? 簡直令人agger異,不是嗎?

也可以在匯編器中進行正則表達式工作。 其實我有。 確實,它和Java一樣有趣。 在Java中進行正則表達式工作就像教一頭豬唱歌一樣:浪費時間,並且使豬煩惱; 它也會惹惱其他所有人,包括您。

學會使用正確的工具完成正確的任務是使專業程序員與代碼猴子分開的地方。 生活太短暫了,無法撞到磚牆。

由於您未指定語言,因此以下是Ruby的一種語言:

ruby-1.9.2-p0 > "toto123".gsub(/([a-z]+)(\d+)/i, '\1 \2')
 => "toto 123"

但是換句話說,它非常相似。

暫無
暫無

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

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