複数文字列の一致する部分のみを抜き出したい

例として

・“テスト1”

・“テスト2”

・“テスト3”

と言う文字3つがあったときに

「テスト」を抜き出したいのですが可能でしょうか。

 

1,2,3はABCかもしれませんし

テストスタート、テストエンドなど決まってないと考えてほしいです。

 

良い

方法が思い浮かばずこちらで相談させていただきました。

 

tanaka さん

2つほど聞きたいのですが

“テスト” を抜き出して "テスト"を使いたいのか、それ以外の文字を使いたいのかどっちでしょう。

テストA とかではなく Aテスト なども考えられるのでしょうか? 

返信有難うございます。

 

> “テスト” を抜き出して "テスト"を使いたいのか、それ以外の文字を使いたいのかどっちでしょう。

最も求めているものとしては

“テスト” と [“A”, “B”, “C”] に分けるところまでになります。

ただ、 “テスト” が抜き出せれば後は元の文字から置換で"テスト"を消して、リスト化して行けばいいかと考えています。

 

>テストA とかではなく Aテスト なども考えられるのでしょうか? 

質問した時点では抜けていましたが、ありえます。

 

よろしくお願い致します。

 

tanaka さん

JavaScript に replace メソッドというものがあるのでそれを使えばいけるかと思います。

https://www.sejuku.net/blog/21107

var str = "123テスト123"

str = str.replace("テスト", "");

console.log(str);

こんな感じで使うと str にテストのみが入ります。

後は 置換した文字列を配列にいれれば想定している処理になるのではないでしょうか。

間違えました。逆です

テストのみではなく数字のみが str に入ります。

しぶい様

回答有り難うございます。

ただ、自分の意図が伝わっていなかったようです…申し訳ありません。

自分がやりたいのは 1つの文字列から抜き出したいというわけではなく

複数の文字列から、一致する部分を抜き出したいのです。

プログラム的にはいかのような感じになります。

var list1 = ["テスト1", "テスト2", "テスト5"]
var list2 = ["Aサンプル", "Dサンプル", "Fサンプル", "Cサンプル"]

var str1 = // ここで list1 に対して何かをする
var str2 = // ここで list2 に対して何かをする

console.log(str1) // -> "テスト"
console.log(str2) // -> "サンプル"

こんな感じなのですが伝わるでしょうか。

よろしくお願い致します。

tanaka さん

すいません、少し追加の質問です。

> ただ、 “テスト” が抜き出せれば後は元の文字から置換で"テスト"を消して、リスト化して行けばいいかと考えています。

とおっしゃっていたのでてっきり文字列の部分はいらないのかと思い、先ほどの例を出したのですが、文字列の部分は欲しいのでしょうか?

想定している複数の文字列群は何かのフィールドの一つ一つの値でしょうか?

それとも文字列か何かの値を配列として持たせてるのでしょうか?もともと配列として持っているのでしょうか?

 

 

var list1 = ["テスト1", "テスト2", "テスト5"]
var list2 = ["Aサンプル", "Dサンプル", "Fサンプル", "Cサンプル"]

varstr1 = // ここで list1 に対して何かをする
varstr2 = // ここで list2 に対して何かをする

console.log(str1) // -> "テスト"
console.log(str2) // -> "サンプル"

var result1 = str1 + " "
for(let i = 0; i < list1.length; i++){
result1 += list1[i].replace(str1)
}
console.log(result1) // -> "テスト 125"

var result2 = ""
for(let i = 0; i < list2.length; i++){
result2 += list2[i].replace(str2)
}
result2 += " " + str2
console.log(result2) // "ADFC サンプル"

しぶい様

 

予定としてはこんな感じで想像してます。

 

>文字列の部分は欲しいのでしょうか?

抜き出した文字列がほしいです。

 

>想定している複数の文字列群は何かのフィールドの一つ一つの値でしょうか?

>それとも文字列か何かの値を配列として持たせてるのでしょうか?もともと配列として持っているのでしょうか?

フィールド1つ1つの値になります。

例として配列を使って混乱させてしまったのでしたら申し訳ありません。

 

よろしくお願い致します。

 

tanaka さん

ありがとうございます。

少しだけ概要がつかめました。

以下のように

var list = ["テスト1", "テスト2", "テスト3", "テスト4", "Aサンプル", "Bサンプル", "Cサンプル"];

文字列の部分が統一性ががある程度あるならば

検索文字列として “テスト” “サンプル” などを使い

パターンマッチング:参考情報 とか

slice、substr、substring :参考情報 などを

使って tanaka さんが想定している処理がある程度いけると思います。

しかし以下のように

var list = ["test12", "サンプル1", "sample3", "テスト1", "test3", "tutorial"];

統一性があまりないとなると難易度が跳ね上がります。

しぶい様

 

予定で上げましたコードのように、リスト内の統一性は保たれています。

 

確かに slice、substr、substring  辺りがやりたいことと非常に近いです。

ただ、「テスト」「サンプル」といった切り取りたい文字列のパターンは数十パターンあり、文字数も統一されていないためそこをどうやって解決すればいいかわかりません。

 

しぶい様の切り出しの参考情報を読んで思いついた方法としては

リストの中の文字列を前方から1文字づつ切り出して切り出した文字が一致するか判定を行い、一致するならそれを一致しない文字に当たるまで続ける。

前方1つ目で一致しなかった場合は後方から1文字ずつ切り出して一致するか確認する。

とかでしょうか。

この方法なら前方(または後方)から何文字切り出せばよいのかわかるので「テスト」「サンプル」を抜き出せる気がします。

 

 

 

 

tanaka さん

ランダムな文字列ではなくある程度決まっているならば、大変だとは思いますが、それを配列か何かに検索文字として値を持っておけば、indexOf メソッドが使えるので、文字数は何とかなりますよ。

指定した文字列どこから始まるかを数字で返してくれるメソッドです。このページとか参考になると思います。

あくまで一例ですが、“テスト”、“サンプル” のみでしたら

(function() {
"use strict";

var records = event.records;
var list = ["テスト1", "テスト2", "テスト3", "テスト4", "Aサンプル", "Bサンプル", "Cサンプル"]

//検索文字として使う文字列群
var strs = ["サンプル", "テスト"];

for(var i = 0; i < strs.length; i++) {
for(var j = 0; j < list.length; j++) {
var str = list[j];

var str_index = str.indexOf(strs[i]);

// 文字列~ の時
if(str_index === 0) {
console.log(str.substr(0, strs[i].length));

// ~文字列 の時、indexOf は指定した文字列がなかったらマイナスの値を返すので 0以上。
} else if(str_index > 0) {
console.log(str.substr(str_index, strs[i].length));
}
}
}
})();

こんな感じの処理をやれば、テスト サンプル なら取り出せたりします。

ただ、テスト サンプル だけの時の想定で

登録文字列が数十パターンあったり、kinotne での運用を想定しているコードではないので。。。参考程度にしてくださいw

しぶい様

いろいろありがとうございました。

参考にさせていただきます。