サブストリングのセットのいずれかを結合することによって、指定されたストリングを作成できるかどうかを調べたいと思います。具体例として、正規表現sg|ge|ne|n|s
のどの部分に一致するかによって文字列"sgene"
を分割したいと考えています。答えは、"s"
、"ge"
、"ne"
です。なぜなら、これらの3つの部分は、文字列が正規表現、目的の部分文字列のセットに分解される方法であるからです。String.scanとFindAllStringの一致動作をオーバーライドするにはどうすればよいですか?
Goにはregexp.(*Regexp).FindAllString
があり、RubyにはRegexp.scan
があります。私のコードでは、正規表現が重複しているので、スーパーストリングの前後に部分文字列を並べるかどうかにかかわらず、1つのマッチが失われます。ここで
が行くで問題を再現するためのプログラムである:
package main
import (
"fmt"
"regexp"
)
func main() {
str := "sgene"
superBeforeSub := regexp.MustCompile("sg|ge|ne|n|s")
subBeforeSuper := regexp.MustCompile("n|s|sg|ge|ne")
regexes := []*regexp.Regexp{superBeforeSub, subBeforeSuper}
for _, rgx := range regexes {
fmt.Println(rgx.MatchString(str), rgx.FindAllString(str, -1))
}
}
このプログラムの出力は:用
true [sg ne]
true [s ge n]
そして、ここではRubyで同じプログラムである(問題ルビーもhereと表示されます):
str = "sgene"
regexes = [/sg|ge|ne|n|s/, /n|s|sg|ge|ne/]
regexes.each do |regex|
puts "%s %s" % [(regex === str).to_s, str.scan(regex).inspect]
end
それは出力:
true ["sg", "ne"]
true ["s", "ge", "n"]
を正規表現エンジンは、文字列は正規表現でマッチさせることができることを知っているが、FindAllString
とscan
はそれをboolean型の一致がない方法と一致していません。彼らは少なくとも1つのeを無視する貪欲な最長一致検索を使用しているようです。どのように正規表現を使用して文字列をいずれかの言語で[s ge ne]
に分割できますか?
人のように、パターンの末尾に移動「N」だった、それは全く不明で、私が求めていたものではありません。私はこの質問に多くの努力を払いました。文字列を '[s ge ne]'に分割したいのですが、いずれの言語もその能力を提供していません。 – EMBLEM
分割操作に適用するルールが完全に理解されていません。もう少しサンプルをくれますか? 目的は何ですか? –
@pascalbetz文字列は 's'で始まり、' ge'とそれに続く 'ne'で構成され、すべてが正規表現の一部です。ブール値マッチはこれを知っていますが、配列のマッチは文字列をそれらの部分に分解しません。正規表現と一致する部分で文字列を分割したい。さて、もし私が文字列 "sgen"を持っていたら、これらはすべて正規表現の一部であるので、 '[s、ge、n]'を期待します。あるいは '遺伝子'から 'ge'、 'ne's、' s'は正規表現の一部分なので '[ge、ne、s]'と期待します。目的は、いくつかの可能な部分文字列のいずれかを一緒に結合することによって、指定された文字列を作成できるかどうかを判断することです。 – EMBLEM