public
Description: Just some random code of mine to learn how to use git
Homepage: http://www.fatvat.co.uk/
Clone URL: git://github.com/fffej/clojure-snippets.git
clojure-snippets / regex.clj
100644 51 lines (46 sloc) 1.75 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
;;; Regex-coach
;;; Inspired by http://www.weitz.de/regex-coach/
;;; jeff.foster@acm.org
 
 
(import '(javax.swing JFrame JLabel JTextField JButton JComboBox JPanel BoxLayout)
       '(java.awt.event ActionListener KeyAdapter)
       '(java.util.regex PatternSyntaxException)
       '(javax.swing.text DefaultHighlighter$DefaultHighlightPainter)
       '(java.awt GridLayout Color))
 
;; Should be a macro
(defn first-match [m]
  (if (coll? m) (first m) m))
 
(defn match [regex text]
  (let [m (first-match (re-find (re-pattern regex) text))]
    (if (nil? m)
      [0 0]
      (let [ind (.indexOf text m) len (.length m)]
[ind (+ ind len)]))))
 
(defn regexcoach []
  (let [frame (JFrame. "Regular Expression Coach") pane (JPanel.) regexText (JTextField.)
targetText (JTextField. "")
statusBar (JLabel. "Match from 0 to 0")
        keyHandler (proxy [KeyAdapter] []
(keyTyped [keyEvent]
(try
(let [m (match (.getText regexText) (.getText targetText))
hl (.getHighlighter targetText)
pen (DefaultHighlighter$DefaultHighlightPainter. Color/RED)]
(.removeAllHighlights hl)
(.addHighlight hl (first m) (second m) pen)
(.setText statusBar (format "Match from %s to %s" (first m) (second m))))
(catch PatternSyntaxException e (.setText statusBar (.getMessage e))))))]
    (doto regexText
      (.addKeyListener keyHandler))
    (doto targetText
      (.addKeyListener keyHandler))
    (doto pane
      (.setLayout (BoxLayout. pane BoxLayout/Y_AXIS))
      (.add (JLabel. "Regular Expression"))
      (.add regexText)
      (.add (JLabel. "Target String"))
      (.add targetText)
      (.add statusBar))
    (doto frame
      (.add pane)
      (.setSize 300 300)
      (.setVisible true))))