就是用怎样的正则表达式来Split目标串为多个标签?

解决方案 »

  1.   

    一次用正则做delimiter会麻烦一些。如果在""中没有空格的话,处理起来会好很多。<script>
    var s='abc def "somegood" okabc def';
    alert(s.split(/( ")|(" )| /))
    </script>
      

  2.   

    那就可以做两次吧?先找两边带引号的。
    即先把“abc def "some good" ok”拆成
    abc def     《--- 1
    some good   《--- 2
    ok但现在又有新问题了,结果1实际上是两个标签,而结果2只有一个,如何来区分它呢?尤其是在标签数量比较多的情况下。
      

  3.   

    <script>
    s = 'abc def "some good" ok';
    t = s.match(/(["']).+\1|\w+/g);
    document.write(t);
    </script>
      

  4.   

    谢谢 xuzuning(唠叨),不过你给的RE有些BUG。1、需要把.+改成非贪婪的,否则匹配含有两个带空格的串时会有点小错误
    如: abc def "some good" "this is" ok 2、英文双引号之间如果还有若干多个引号,如果这些在中间的引号的后一个字符不是空格(主要是针对起闭合作用的最后一个引号的判断),则整个词组应被认为是一个标签。
    如 abc "so"me g"ood" 应该被识别为两个标签:abc和so"me g"ood3、对于不构成词组的引号,应当只认为它是标签的一部分。
    如 abc so"me g"ood 应该就是三个标签:abc、so"me、g"ood。
      

  5.   

    这个问题其实并不是特别简单,有许多情况需要考虑。
    如果能解决的话,大家以后在处理Tag及类似对象时,就可以直接用了:)我能想到的一些测试例子(左边是用户的输入,右边是分隔好的标签):abc "some good" "this is" ok  -》 abc|some good|this is|ok"some good" abc "this is" ok  -》 some good|abc|this is|ok"so"me g"ood" abc "this is"  -》so"me g"ood|abc|this is"so "me g" ood" "ab"c"   -》  so"me g|ood"|ab"c另外,由于用户在输入标签时,可能打开了中文输入法,所以标签之间很可能使用全角的中文空格分隔,也需要考虑。也就是说英文空格和全角中文空格的作用应该是一样的。把以上例子中的英文空格部分地或全部地代换为中文空格,如果都能正确处理,那么这个问题就可以结了:)如需要额外讨论,可以另开一帖的。谢谢大伙!
      

  6.   

    我的答案是:
    (?!")[^\x20]+|"[^"]*"测试页面:(推荐)
    http://www.regexlab.com/zh/workshop.asp?pat=%28%3F%21%22%29%5B%5E%5Cx20%5D%2B%7C%22%5B%5E%22%5D*%22&txt=abc%20def%20%22some%20good%22%20ok&dlt=0
      

  7.   

    谢谢楼上的兄弟,不过不好意思,你给的RE只能Match我给的第一个例子,后三个都是错误的。
      

  8.   

    经过修改:
    (?!")[^\s]+|"([^"]|"(?!\s))*"测试页面:(推荐)
    http://www.regexlab.com/zh/workshop.asp?pat=%28%3F%21%22%29%5B%5E%5Cs%5D%2B%7C%22%28%5B%5E%22%5D%7C%22%28%3F%21%5Cs%29%29*%22&txt=abc%20%20abc%22def%20%20%20%22some%20good%22%20%20%22some%22good%22%20ok&dlt=0
      

  9.   

    abc "some good" "this is" ok  -》 abc|some good|this is|ok"some good" abc "this is" ok  -》 some good|abc|this is|ok"so"me g"ood" abc "this is"  -》so"me g"ood|abc|this is"so "me g" ood" "ab"c"   -》  so"me g|ood"|ab"c
    首先,下边这两个就看不出什么规则了。
    其次,是不是凭这四个例子就代表了所有情况?
    你自己是否清楚所有的规则,如果清楚就一条一条的写出来,再拿给别人看看有没有写明白,然后再拿出来问,这样是浪费大家的时间。
    写来写去只能猜你想干什么,是不是太没意思了。
      

  10.   

    下面两个(第三行、第四行)规则很明显:3、英文双引号之间如果还有若干多个引号,如果这些处在中间位置的引号的后一个字符不是空格(主要是针对起闭合作用的最后一个引号的判断),则整个词组应被认为是一个标签,并且此引号也仅就是一般字符,不具备构成词组的功能。
    如 abc "so"me g"ood" 应该被识别为两个标签:abc和so"me g"ood
    再如 "so"me g"ood" abc "this is"应该被识别为三个标签:so"me g"ood、abc、this is4、对于不构成词组的引号,应当只认为它是标签的一部分。
    如 abc so"me g"ood 应该就是三个标签:abc、so"me、g"ood。
    再如:"so "me g" ood" "ab"c"应该被识别为三个标签:
    so"me g(因为字母g后面的引号有空格,所以与s前面的引号构成一对)、
    ood"(字母d后面虽然有引号,但是没有前导引号与之构成完整的一对,所以此引号只是标签的内容)、
    ab"c(引号不但可以用来标示词组,当然也应该兼容一个单词的情况)PS:我也就一个人在业余研究这个东西,目标是想有一个比del.icio.us更加完善的Tag划分方法。有怎样的要求,我自己当然清楚。我把这些要求浓缩归纳为四条例子,简易直观,总比啰啰嗦嗦说一大堆又说不清楚好。同时我很奇怪,为什么别的兄弟能看懂,有星星的你就看不懂??真的全部是我的原因么?
      

  11.   

    To sswater(光杆兵):太感谢你的回复了!那四个例子都能正确地通过测试,等稍后我做一下完整的测试就结帖。对了,有空的话,你也到这里回一下帖:
    http://community.csdn.net/Expert/TopicView.asp?id=4920147
    好处嘛,是明显地,呵呵 :)
      

  12.   

    To sswater(光杆兵):经过多方面,反复地测试,还在http://www.regexlab.com/zh/workshop.asp处测试了,
    发现《"this is"good 》达不到预期的效果。
    原因是:作为词组起始引号的第一个引号,并没有一个闭合引号(即这样的一个引号:其后紧接的是一个空格或字符串结束符)。在这种没有闭合的情况下,《"this is"good 》应该被分为两个标签:"this和is"good,而不是this is和good。如此的处理是否可以实现?再次表示感谢!PS:再顺便测试一下这个例子吧:
      《"so good"abc "this one》应为"so|good"abc|"this|one
    ---------------------------
    其它的兄弟也可以讨论讨论的啊,谢谢!
      

  13.   

    "([^"]|"(?=\S))*"(?!\S)|\S+测试页面:(推荐)
    http://www.regexlab.com/zh/workshop.asp?pat=%22%28%5B%5E%22%5D%7C%22%28%3F%3D%5CS%29%29*%22%28%3F%21%5CS%29%7C%5CS%2B&txt=abc%20abc%22def%20%22some%20good%22%20%22some%22good%22%20%22this%20is%22good%20%22one&dlt=0
      

  14.   

    感谢sswater(光杆兵) 的回答,结帖!