2016-11-13 7 views
1

私の入力文字列がある場合、私は、文字列正規表現パターンで文字を見つける

に引用符内の対等のすべての回出てくる見つけるしようとしています:私のように私の文字を見つけたい

anything='', bob2='age=24, sex=M', dilan=24, noble1='yellow' 

anything='', bob2='age~24, sex~M', dilan=24, nobel1=24 
        ^ ^
としてそれを置換することによって続い

anything='', bob2='age=24, sex=M', dilan=24, nobel1=24 
        ^ ^

を以下

私はすべてのoccurances

'[^',].+?' 

しかし、それdidntの仕事を見つけるために、以下を試してみました。

+0

によって置き換えられます

?可能な答えはそれに依存するかもしれません。あなたの文字列は常に正しい形式(引用符の中にエスケープシーケンスはありません)ですか? –

+0

使用する言語はHadoop Impala SQLです。引用符の中にエスケープシーケンスはありません –

+0

引用符の中に引用符はありません。だからparam2 = '年齢= '24'、性別= 'M' 'はこの質問の正当なケースではありません –

答えて

0

グループを使用すると、正規表現でそのようにすることができます。 ~で第一と第三のグループに置き換え、その後

(?<=age)(\=)(\S+\s\w+)(\=) 

、無傷の第二のグループを保つ:

このコードを試してみてください~$2~

デモ:https://regex101.com/r/qxR9ty/1

更新

まず、@Maverick_Mrtの提案にしたがってNegative Lookbehindを使用してから、除外するカテゴリーをキャンセルするには、|などを追加します。 cat1|cat2

(?<!app|policy_name|dvc_host|sender|sal)\= 

デモ:https://regex101.com/r/qxR9ty/

+0

ありがとう。しかし、問題はありますが、私は "年齢"をハードコードすることはできません –

+0

@GeorgeJoseph更新されたコードを試してください – Ibrahim

+0

私はapp | policy_nameのようなパラメータのリストを予測することができません –

0

それだけでは正規表現で、あなたの要件を実装するのは非常に困難です。

私はそれを実装するためにcharでString charを繰り返したいと思います。

以下のコードを確認してください。私はその中にコメントを入れました。私はJavaを使用していますが、内部でアルゴリズムを利用することができます。このことにより、

(?<!param[\d+])= 

をと置き換えます:

public class Main { 
    public static void main(String args[]){ 
     String input = "param1='', param2='age<b>=</b>24, sex<b>=</b>M', param3=24, param4='yellow'"; 
     char[] arr = input.toCharArray(); 
     boolean close = true; 

     /** 
     * Iterate the char array 
     */ 
     for(int i = 0;i < arr.length;i++){ 
      if(arr[i] == '\''){ 

       /** 
       * Ignore the escaped ' char in '' 
       */ 
       if(i > 0 && arr[i - 1] == '\\'){ 
        break; 
       } 

       /** 
       * Use close to check whether equal sign is inside the '' 
       */ 
       if(close){ 
        close = false; 
       }else{ 
        close = true; 
       } 
      }else if(arr[i] == '='){ 
       if(!close){ 
        arr[i] = '~'; 
       } 
      } 

      System.out.print(arr[i]); 

     } 
    } 
} 
+0

ありがとうございました。私はより具体的にすべきだった。使用される言語はImpala SQL、 –

0

これを試してみてください

内訳:それは任意の '=' を探しますと、それはのparamで先行するかどうかを確認します [\ d +]かどうか。 param \ d +が先行していない場合は、=記号がキャプチャされます。 =は〜

あなたはどのようなツール/言語を使用している

Explanation

+0

です。おかげさまでほぼ同じです。私はより具体的であったはずです実際の文字列はこのapp = ''、policy_name = '年齢= 24、性別= M、sal = 300'、dvc_host = 24、sender = '<[email protected]>'のようになります。だから私は "param"をハードコードすることはできません。 –

関連する問題