4

文字列と文字列の最後にいくつかのパターンがあります。このパターンを単語の最後で正確に削除するにはどうすればよいですか。ただし、最初または途中に存在する場合でも、それ以上は削除できません。たとえば、文字列は

PatternThenSomethingIsGoingOnHereAndLastPattern

最後に「パターン」を削除して、結果が次のようになるようにする必要があります。

PatternThenSomethingIsGoingOnHereAndLast

どうやってやるの?

4

3 に答える 3

9

あなたの質問は、パターンが正規表現である必要があるのか​​、プレーンな文字列である必要があるのか​​を指定していません。後者の場合、単純なアプローチを使用できます。

(defn remove-from-end [s end]
  (if (.endsWith s end)
      (.substring s 0 (- (count s)
                         (count end)))
    s))

(remove-from-end "foo" "bar") => "foo"
(remove-from-end "foobarfoobar" "bar") => "foobarfoo"

正規表現のバリエーションについては、DominicKexelの回答を参照してください。

于 2012-12-04T15:02:09.013 に答える
9

使用できますreplaceAll

=>(.replaceAll "PatternThenSomethingIsGoingOnHereAndLastPattern" "Pattern $" "")
"PatternThenSomethingIsGoingOnHereAndLast"

またclojure.string/replace

=>(clojure.string / replace "PatternThenSomethingIsGoingOnHereAndLastPattern"# "Pattern $" "") "PatternThenSomethingIsGoingOnHereAndLast"

于 2012-12-04T15:03:10.263 に答える
0

ここで必要なものはすべて私が信じています

(def string "alphabet")
(def n 2)
(def m 4)
(def len (count string))

;starting from n characters in and of m length;
(println
 (subs string n (+ n m)))              ;phab
;starting from n characters in, up to the end of the string;
(println
 (subs string n))                      ;phabet
;whole string minus last character;
(println
 (subs string 0 (dec len)))            ;alphabe
;starting from a known character within the string and of m length;
(let [pos (.indexOf string (int \l))]
  (println
   (subs string pos (+ pos m))))     ;lpha
;starting from a known substring within the string and of m length.
(let [pos (.indexOf string "ph")]
  (println
   (subs string pos (+ pos m))))      ;phab
于 2012-12-04T15:04:52.683 に答える