やりたいこと
下記のような文字列から"なんと"という文字列を取得したいと考えています。
Javascript
1var str = "Aさん 東京にお弁当を持ってBさんに会いに行く。Aさん なんとBさんに会えず"
試したこと
そこで、以下のような正規表現でstr.matchをすると東京にお弁当を持って
を取得してしまいます。
JavaScript
1var pattern = /Aさん (.+?)Bさん/;
なるほど、前段に最短でマッチするものが存在していることに気が付きました。今度はこのマッチしてほしくないケースについては、必ずその間に東京か大阪が含まれる文脈であることがわかっているため、以下のようなパターンを当ててみました。
JavaScript
1var pattern = /Aさん ^(?!東京|大阪)(.+?)Bさん/;
そると期待するなんと
は取得できずに何も一致が得られない結果となりました。どのように東京、大阪を含む記載を否定して、なんと
を取得できますでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
melianさんの回答だと、「Aさん なんとBさんに会えず。Aさん 東京にお弁当を持ってBさんに会いに行く。」のように順番が逆だとマッチしませんね。
マッチしない理由が分かりにくいですが、(?!
の直後の.*?
が「なんとBさんに会えず。Aさん 」にマッチしてしまうからでしょう。もうちょと工夫するとなんとかなるのかも知れませんが、下記のように正規表現はシンプルにして、言語側で対応するのが簡明です。複数個あっても対応できます。また、除外条件が複雑になった場合の対応も、判断するコードを追加するだけなので簡単です。
JavaScript
1function test(str){ 2 const pattern = /Aさん(.*?)Bさん/g; 3 const exclude = /東京|大阪/; 4 const match_str = [...str.matchAll(pattern)].map(m => m[1]); 5 const result = match_str.filter(m => !m.match(exclude)); 6 console.log(result); 7} 8 9test("Aさん 東京にお弁当を持ってBさんに会いに行く。Aさん なんとBさんに会えず"); 10// => [ ' なんと' ] 11test("Aさん なんとBさんに会えず。Aさん 東京にお弁当を持ってBさんに会いに行く"); 12// => [ ' なんと' ] 13test("Aさん なんとBさんに会えず。Aさん 東京にお弁当を持ってBさんに会いに行く。AさんやっぱりBさんに会えず"); 14// => [ ' なんと', 'やっぱり' ]
投稿2023/12/24 18:13
編集2023/12/25 00:01総合スコア85766
0
投稿2024/01/16 15:16
総合スコア11
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
javascript
1var pattern = /Aさん ((?:(?!東京|大阪).)+?)Bさん/; 2const match = str.match(pattern); 3console.log(match[1]);
サブマッチの1つ目を取り出します
以下追加情報
参考記事
https://qiita.com/pal4de/items/7e2292cfd7ac424e0836#応用例
強引にサブマッチを使わず、一致文字として取り出したいなら
javascript
1var pattern = /(?<=Aさん )((?!東京|大阪).)+?(?=Bさん)/;
投稿2023/12/25 12:32
編集2023/12/25 23:13総合スコア359
0
ベストアンサー
文字列全体に特定の文字列が存在しない事を保証するには、1文字ずつ判定させる必要があります。
javascript
1const str = "Aさん 東京にお弁当を持ってBさんに会いに行く。Aさん なんとBさんに会えず" 2const result = /Aさん((?:(?!東京|大阪|Bさん).)*)(?=Bさん)/s.exec(str); 3console.log(result[1]); // "なんと"
Re: pegy さん
投稿2023/12/24 19:09
編集2023/12/26 09:43総合スコア18189
0
Windows 11、cscriptコマンドにて確認。match結果の2個目が「なんと」になります。
var pattern = /Aさん ((?!.*(東京|大阪)).*)Bさん/;
think49さんのコメントを受けて、修正しました。
var pattern = /Aさん (((?!Aさん|Bさん|東京|大阪).)*)Bさん/;
投稿2023/12/24 17:18
編集2023/12/24 20:48総合スコア1057
0
どのように東京、大阪を含む記載を否定して、なんとを取得できますでしょうか
javascript
1const str = "Aさん 東京にお弁当を持ってBさんに会いに行く。Aさん なんとBさんに会えず"; 2const pattern = /Aさん (?!.*?(?:東京|大阪))(.+?)Bさん/; 3const match = str.match(pattern); 4console.log(match[1]) 5 6# なんと
投稿2023/12/24 15:10
総合スコア20574
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/12/28 04:24
2023/12/28 04:25
2023/12/29 09:05