2016-06-02 11 views
1

ここで私が持っている例です。カッコ内の単語を除くすべての単語を取得するにはどうすればよいですか?正規表現/ MySQLの

JELLY2some text 

some text{JELLY2}some textsome textsome text 
Sample text for testing: 
some textJELLY2 {some text JELLY2 lsdkfjsd}にsome text 

私は次のようにカッコ内のものを除くすべてのJELLY2を取得したい:

{JELLY2} 

{some text JELLY2 lsdkfjsd} 

http://regexr.com/3dhsl

私はseleによってデータを取得する必要がありますctステートメントのようなもの:

SELECT `id` FROM `table` WHERE `body` REGEXP 'JELLY2' 

もしかしたら、RLIKEや他の方法で可能なのでしょうか?それはあなたがMySQLの正規表現でこれを行うことができそうだし、私はそれがより良い別の言語を使用して近づいたことと思いますが

SELECT `id` FROM `table` WHERE `body` RLIKE 'JELLY2' 
+1

「JELLY2」の外側の中括弧ではどうしますか?交換?削除しますか?言語は何ですか? JS? –

+0

@WiktorStribiżewmysql regexp – whitesiroi

+1

MySQLでサポートされていないアサーションを使用する必要があるため、POSIX正規表現を使用するため、これは可能ではないと思います。 'JELLY2'を含むすべての結果を選択し、中括弧の外側に表示されないものをフィルタリングするために別の言語を使用できますか?それでも、キーワードが1つではなく他の{{この} JELLY2}のようには見えない複数の埋め込みブレースを持つことができるので、それは自明ではありません。 –

答えて

2

ターゲットはカッコではないことを要求するように、括弧の入力をスキップすることができ否定文字クラスとグループを使用して、プラススタート/エンド・アンカー:

SELECT id 
FROM table 
WHERE body RLIKE '^([^{]*(\{[^}]*\})?)*JELLY2([^{]*(\{[^}]*\})?)*$' 

live demoを参照してください。

+0

本当にありがとうございます、これも(「some textJELLY2(some text JELLY2 lsdkfjsd)にいくつかのテキストを入力してください」) JELLY2が{}内にあり、レコード内にある場合は、そのIDも取得します。出来ますか? – whitesiroi

+0

これは、 'JELLY2'が中括弧の外側にある中括弧を含む文字列に対しては機能しません。たとえば、 '{example} JELLY2'のようになります。 –

+0

@mattそうですが、私はそれに取り組んでいます... – Bohemian

1

は、あなたがこれを行うにはMySQLの機能を記述することができます。

おそらく多くのアプローチがあります。これは、needleのすべての出現をhaystackにループして、出現に先行する{の文字の数が、その前の}の文字の数より少ないかどうかをチェックします。これは特に頑強ではないことを意味します(}}}{JELLY2})。しかしこれが問題であれば、さらにアイデアを開発することができます。

DELIMITER // 
CREATE FUNCTION contains_text_outside_braces(needle VARCHAR(255), haystack VARCHAR(255)) 
RETURNS INT DETERMINISTIC 
BEGIN 
    DECLARE pos INT; 
    DECLARE previous INT DEFAULT 1; 
    DECLARE length INT DEFAULT LENGTH(needle); 
    DECLARE prefix VARCHAR(255); 
    LOOP 
     SET pos = LOCATE(needle, haystack, previous); 
     IF pos = 0 THEN 
      RETURN 0; 
     END IF; 
     SET prefix = LEFT(haystack, pos - 1); 
     IF LENGTH(REPLACE(prefix, '{', '')) >= LENGTH(REPLACE(prefix, '}', '')) THEN 
      RETURN 1; 
     END IF; 
     SET previous = pos + length; 
    END LOOP; 
END// 

DELIMITER ; 

SELECT * FROM example_table WHERE contains_text_outside_braces('JELLY2', content); 
関連する問題