質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

3回答

803閲覧

jsの正規表現で,(カンマ)がある場合、文字列を全選択したい。但し()内のカンマは無視する。

webgoto

総合スコア1293

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

1グッド

0クリップ

投稿2023/03/27 11:30

編集2023/03/27 12:19

実現したいこと

正規表現で文字列に,(カンマ)がある場合、文字列を全選択したい。
但し()内のカンマは無視する。

前提

テスト文字列

■ マッチさせる a,b,c,d{ a,b(c, d),e { a,(b,c),d{ a , bwefbfrew{ a,:is(b,c)s ss:is(b,c)sssss{ wefewfew,fewf{ fwafaewa,(b,c){ ■ マッチさせない wefwefewfee{ (a,b,c,d)eeeeee(few)eeee{ ewfeweew{ wafewaf(s)ewfewew(){ afewfe(s,)wfew{ fef ewee{ a sefe few:has(few,few){ aafew:has(few,fewf,few){ ■ 考慮不要 (マッチしてもしなくても良い) s,ef (sfew, fwe{ 括弧か閉じられていない s,ef )sfw(, fwe{ 括弧か閉じられていない sef((sfew, fwe )) , ew { 括弧のネスト(正規表現が複雑になりそうなので不要 ルール的にはマッチ) sef((sfew, fwe )) ew { 括弧のネスト(正規表現が複雑になりそうなので不要 ルール的にはマッチしない) sef((sfew, fwe ) ,)ew { 括弧のネスト(正規表現が複雑になりそうなので不要 ルール的にはマッチしない) ,fewfew,{ カンマで始まる、終わる efwf,,, fewe{ カンマが連続する

該当のソースコード

自分でこのような正規表現を書き、上記の例では動いています。
/^((?=[^(]*,[^)]*).+)\{/

発生している問題

span:is(p, b, a),da{
これにもマッチするはずなのにマッチしないです。

どのような正規表現を書けばよいでしょうか?
またテストが抜けている部分があれば追加いただければと思います。

よろしくお願いします。

arcxorを押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2023/03/27 11:41

括弧のネスティングも想定する必要がありますか?
webgoto

2023/03/27 12:06

ありがとうございます。 ほぼない事と考えておりますので考慮不要でございます。 テスト部分に考慮不要の内容を追記いたしました。
melian

2023/03/27 12:43

括弧で囲まれている部分文字列を削除してから ", " が含まれているかどうかをチェックする様にしてみてはどうでしょうか。 text = 'span:is(p, b, a),da{' text.replace(/\(.*?\)/g, '').includes(',') text.replace(/\(.*?\)/g, '').includes(',')
webgoto

2023/03/27 12:49

文字列の内容も必要なため、その方法だと期待する動作を得られないかと思われます。 コメント頂きありがとうございます。
melian

2023/03/27 12:57 編集

それでしたら関数化すればよいかと。 let func = (text) => { return text.replace(/\(.*?\)/g, '').includes(',') ? text : null; } const result = func('span:is(p, b, a),da{')
webgoto

2023/03/27 13:11

後ろに続く文字があったりグループの中のテキストを取りたいので正規表現で取得できたらと思います。 よろしくお願いいたします。
melian

2023/03/27 13:17

「文字列を全選択したい」と書かれていますが、そうではなく何らかの部分文字列のみを取得したいということでしょうか?
arcxor

2023/03/27 13:24

XY問題に見えるのですが、なぜ正規表現にこだわっているのですか。
webgoto

2023/03/27 13:26

今回の質問につきましては得たい結果をどのような方法でも実現したいということではなく、正規表現の書き方を知れればと思っております。 そのため、テスト文字列の「マッチさせる」の1行全体にマッチする正規表現の書き方がわかればと思っております。 何卒よろしくお願いいたします。
guest

回答3

0

ベストアンサーがありますが、もう少しシンプルな回答を

JavaScript

1/^([^(,]|\([^)]*\))+,.+$/

~追記~

1行毎にチェックすると思ってました。
複数行に対応するには

JavaScript

1/^([^(,\n]|\([^)]*\))+,.+$/gm

として下さい。
https://regex101.com/r/eTcLHf/1
で確認するなら

JavaScript

1/^([^(,\n]|\([^)]*\))+,(.+)$/gm

とすると色分けされて分かり易いです。

投稿2023/03/27 18:54

編集2023/03/28 18:07
CTRL-S

総合スコア176

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

webgoto

2023/03/29 00:34

1行毎のチェックで大丈夫なのですが、ツールの使い方を間違っていたようです。 今1行づつで試しますと最初に頂いた物で動作していました。申し訳ございません。 先読みなどを使わずにもできるのですね。 こちらのほうがシンプルですね。ありがとうございます!
guest

0

ベストアンサー

https://regex101.com/r/eTcLHf/1

js

1/^(?!(?:[^,()]*|(?:\([^)]*\)))*$).*$/

これはどうでしょうか。要件を満たすでしょうか。

投稿2023/03/27 14:34

arcxor

総合スコア2859

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

webgoto

2023/03/27 14:41

ご回答ありがとうございます! おそらく条件通りに動いているかと思います。 分解して勉強させて頂きます。
yambejp

2023/03/28 01:51

((a,b)) とかヒットしませんか?
guest

0

カッコ自体かならず対になっているわけではなく、文字列としてのカッコもあるため
明確にカッコの発生条件が定義されているのであれば可能ですが
とくにネストがある場合は正規表現で処理するのは難しいと思ったほうがよいでしょう。

投稿2023/03/28 01:55

yambejp

総合スコア114814

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

webgoto

2023/03/28 02:01

コメントありがとうございます! 「前提」の項目に記載しており、折りたたまれてわかりにくいのですが、 「ネスト」、「括弧が閉じられていない」は考慮不要としております。
yambejp

2023/03/28 04:18

「sef((sfew, fwe )) , ew { 括弧のネスト(正規表現が複雑になりそうなので不要 ルール的にはマッチ) sef((sfew, fwe )) ew { 括弧のネスト(正規表現が複雑になりそうなので不要 ルール的にはマッチしない)」 と書いてあるのは無視してよろしいのですか?ネストしていますよね?
webgoto

2023/03/28 05:50

そちらは考慮不要の項目になりますので、条件に入れていただくなくて大丈夫です!
yambejp

2023/03/28 05:55

> 考慮不要の項目 なるほど、ヒットしてもしなくてもどちらでもいいということですね。 それであれば問題ありません
webgoto

2023/03/28 06:10

ご思慮いただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問