1

一致させたいこれらのカップル行があり、現在、複数の正規表現を使用してすべてを一致させていますが、1つの正規表現で両方を一致させることが可能かどうか疑問に思っています。

@@Author:logan
//and these, three variations
@@tags:markdown,github,repetitivetag, tagwithsubtags:subtag, another:subtag:subtag2:repeating:this:repeating,repetitivetag,repetitivetag:withsubby,repetitivetag:withsubtag
@@tags:markdown;github;repetitivetag;tagwithsubtags:subtag,another:subtag:subtag2:repeating:this:repeating;repetitivetag;repetitivetag:withsubby;repetitivetag:withsubtag
@@tags:markdown;git-hub;repetitive-tag;tag_with_sub-tags:sub_tag,another:sub_tag:sub-tag2:repeating:this:repeat-_-_-ing;repetitive-tag;repetitive_tag:with_subby;repetitive_tag:with_subtag

私が最初に行うことは、@@NAME:VALUEパーツを一致させることです。

  • /^(?:@@)(\w+):(.*.)(?:\n+|$)/gm

NAME最初のグループがで、2番目のグループがであるとしましょうVALUE

もしそうなら、私NAMEtags次の正規表現に一致しますVALUE

  • /(\w+)((?=,|;)|(:\w[\w|\-]+\w){0,}|)/g

これは、以前に一致した、TAG;TAG;TAG ...またはそのTAG,TAG,TAG ...中で一致するいくつかのグループに一致しますVALUE

TAG次に、それぞれをこれと一致させて、SUBTAG

  • /(:)(\w[\w|\-]+\w)(?=:|)/g

これで、上記で一致したグループ:SUBTAG:SUBTAG:SUBTAG ...内のようなグループと一致しますTAG

要約すれば

合わせたい

  • (@@)(NAME)(:)(VALUE)
    • (TAG)(;)(TAG)(;)(TAG) ...VALUEで
      • (:)(SUBTAG)(:)(SUBTAG))(;)タグで

  1. @@Author:logan取得できるはずですName = AuthorValue = logan

  2. 値が複数の場合(コンマまたはセミコロンで区切られている場合など)、次のようなものに一致すると、次のよう@@tags:tag1;tag2になります。

    Name = Tags、`値=['tag1'、'tag2']

  3. 値に次のようなサブ値がある場合

    @@Author:logan:lastname

    またはその意図された目的としてこれ

    @@Tags:tag1:subtag;tag2:subtag1:subtag2取得できるはずです:

    Name = AuthorValue = [{logan : [lastname]}]および

    Name = TagsValue = [{tag1 : [subtag]}, {tag2 : [subtag1, subtag2]}]

グループ内のグループを、存在する場合にのみ一致させるにはどうすればよいですか?

4

1 に答える 1

2

これにより、必要な出力が正確に得られます。

// Examples:
var a='@@Author:logan';
var b='@@tags:tag1;tag2';
var c='@@Author:logan:lastname';
var d='@@Tags:tag1;tag2:subtag1:subtag2';
var hard1='@@tags:markdown,github,repetitivetag, tagwithsubtags:subtag, another:subtag:subtag2:repeating:this:repeating,repetitivetag,repetitivetag:withsubby,repetitivetag:withsubtag';
var hard2='@@tags:markdown;github;repetitivetag;tagwithsubtags:subtag,another:subtag:subtag2:repeating:this:repeating;repetitivetag;repetitivetag:withsubby;repetitivetag:withsubtag';
var hard3='@@tags:markdown;git-hub;repetitive-tag;tag_with_sub-tags:sub_tag,another:sub_tag:sub-tag2:repeating:this:repeat-_-_-ing;repetitive-tag;repetitive_tag:with_subby;repetitive_tag:with_subtag';

function tags(a){
    // Gets the name:
    var name=a.match(/^@@.*?(:|.$)/);
    if(!name) return;
    var temp=a.indexOf(':')+1;
    name=name[0].substring(2).replace(':','');
    // Returns the name if thats all there is:
    if(!temp) return name;
    a=a.substring(temp);
    // Gets the value:
    var value=a.split(/[,;]/);
    if(value.length==1&&value[0].indexOf(':')==-1)
        value=value[0];
    else for(var i=0;i<value.length;i++) if(value[i].indexOf(':')!=-1) {
        // Gets the subtags if they exist:
        temp={};
        a=value[i].split(':');
        // .shift() will remove/return the first of the array
        temp[a.shift()]=a;
        value[i]=temp;
    }
    return {name:name,value:value};
}
console.log([tags(a),tags(b),tags(c),tags(d),tags(hard1),tags(hard2),tags(hard3)]);

これは実際にコーディングするのに本当にクールでした。あなたの質問があなたが望むものを正確に言っているかどうかはわかりませんが、そうでない場合は、すべてが本当に簡単に変更できるはずです。else-for-ifステートメントが気に入っていただければ幸いです。

于 2013-01-13T10:48:54.677 に答える