2017-02-08 53 views
4

我想解析字符串以找到在(character, n)集合中找到的前N個重複字符。 (例如,對於"ozzllluu"和集合(「u」=> 2),(「d」=> 2),(「l」=> 3)和(「r」=> 3)...我想找到「lll」,因爲它是3個字符,發生在兩個「u」之前。解析字符串以查找第一個重複字符 - 函數與prodecural編碼樣式

程序風格的解決方案:

Rebol [] 

seq-set: [#"u" 2 #"d" 2 #"l" 3 #"r" 3] 
str: "ozzllluu" 

lastchar: "" 
cnt: 1 
seq-char: "" 

foreach char str [ 
    either char = lastchar [ 
     cnt: cnt + 1 
     if (select seq-set char) = cnt [ 
      seq-char: char 
      break 
     ] 
    ][ 
     cnt: 1 
    ] 
    lastchar: char 
] 

either seq-char = "" [ 
    print "no seq-char" 
][ 
    print join "seq-char " seq-char 
] 

我會怎麼做使用parse規則同樣的事情?

簡而言之:

  • parse字符串中(字符,N)發現前n複製的字符集
  • 「功能」 的現行程序代碼
  • 狗食到雷博爾/紅!
+0

提示:對問題或答案中的「幽默」非常小心。你的方法簡直讓我困惑。你希望別人花時間幫助你。沒有必要對此有趣。既不問,也不在回答時。是的,有時候這很好,但特別是在「只寫」對話中,「好幽默」很難**。 – GhostCat

+0

@GhostCat \t \t https://en.wikipedia.org/wiki/Eating_your_own_dog_food - \t \t \t搜索 「微軟」 – OneArb

回答

3

只是一個簡單的規則爲起點

keys: ["uu" | "dd" | "lll" | "rrr"] 
rule: [(k: none) any [[copy k keys to end ] | skip] ] 

>> parse "olllddsslll rr rrr" rule k 
== "lll" 
+3

很容易的構建規則太:**'刪除收集[的foreach [CH RP] [」 u「2」d「2」l「3」r「3] [keep'|保持頭插入/複製ch ch rp - 1]]'** – rgchris

8

下面是使用紅色的解析解(在R3的作品太):

seq-set: [2 #"u" | 2 #"d" | 3 #"l" | 3 #"r"] 
rule: [any [set char seq-set break | skip]] 

red>> parse "ozzllluu" rule 
red>> char 
== #"l" 
1

下面parse規則找到所有重複,並跳過其他。

;Rebol 2 version 
char: charset [#"a" - #"z"] 
parse/all "wqooossssccfgg" [some [ 
    copy x char [copy y some x (print [s: join x y length? s])] 
    | skip 
    ] 
] 
;output 
ooo 3 
ssss 4 
cc 2 
gg 2 

;Red version 
parse "wqooossssccfgg" [some [ 
    copy x char [copy y some x (print [s: append x y length? s])] 
| skip ]] 
相關問題