求正则表达式

GDPudding 2006-09-23 09:33:18
第一次发帖

自己百思不得其解,所以上来求助了

一个示例字符串: aabbcc "ccccc" dddd qqqq eeee "wwwwee" "wwqwwqw" aaaasd 'asdsadw' poqwep "asdasdasd" asdsadasd

问题是用正则将字符串一个个地取出来,要求取出的不包含单双引号的内容
...全文
416 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
GDPudding 2006-09-24
  • 打赏
  • 举报
回复
目前我已经想到了利用正则加递归的方法

一个正则的确是解决不了

因为我一直都想这样做,可是总是不成功,就因为预查功能不够强大

我的递归思路如下:

先用match取下引号内容(引号内容和非引号内容我都要作特殊处理),然后利用正则全局对象RegExp的leftContext和rightContext属性作参数递归下去,直至匹配不成功,再对剩下的内容(已经不存在引号)再作其他处理

最后目的就是将分开处理的字符按原来的排列顺序重新组合(所以我想到了用递归),一次处理的字符为单行,可不必太注意速度问题

希望有高手给出更好的解决方法

在此先谢过

随后给分

有头绪的请回帖说说

不管最后解决不解决,五天内结帖,当然,解决后立即结束

目前我能发的分貌似只有这么多,等级不够,也太久没上来了
chaircat 2006-09-24
  • 打赏
  • 举报
回复
貌似...一个正则搞定不了...因为还要不能重复...
zh__ua 2006-09-24
  • 打赏
  • 举报
回复
这个问题,关键是怎么判断间隔字符
你可以把对有引号的判断放前面,这样再次匹配时就是无引号的了
只要把分隔字符弄好了,应该就没问题了
GDPudding 2006-09-24
  • 打赏
  • 举报
回复
一个return 就直接匹配就行了,哈哈,;可以用;?
所有可能有可能无的都可以用?或*表示就行了,相信你已经找到解决办法了


-----------------------------------------------------------------

这个直接匹配显然是不现实的

这样会把"内的也匹配出来

另外一个问题就是那个

" return "

这样的话前面做的都没有效果了

呵呵

还是退回到递归的方法把引号全取出来单独对待才行

zh__ua 2006-09-24
  • 打赏
  • 举报
回复
一个return 就直接匹配就行了,哈哈,;可以用;?
所有可能有可能无的都可以用?或*表示就行了,相信你已经找到解决办法了
GDPudding 2006-09-24
  • 打赏
  • 举报
回复
总结问题

就是我个人对\b,\B理解不当,造成小问题变成自己的大问题

十分谢谢

zh__ua(刚来玩,请多指教)

也谢谢大家参与

结帖....

GDPudding 2006-09-24
  • 打赏
  • 举报
回复
有个别人问题我已经想到了

顺便也帮忙考虑下吧

如果是

return;

这句...

貌似,表达式还复杂着呢

嘿嘿

我自己加了[\s;]

可是如果一行只有一个

return

没其他就无能为力了...

而且处理前我是先用

/^[\s| ]*/g

把前头的空白去掉了

呵呵

应该是没什么办法了

效率啊...

zh__ua 2006-09-24
  • 打赏
  • 举报
回复
考虑效率的话,只能行首和尾单独判断一下,这个在我上面就说了,哈哈
GDPudding 2006-09-24
  • 打赏
  • 举报
回复


想到一块地方了

一旦用上了?

"就出来

可能我多加几个 | | 可以的吧

效率低点也只能是这样了
GDPudding 2006-09-24
  • 打赏
  • 举报
回复
\s\b(str)\b\s

在行首或者行末时会失效

如果是改成

\s?\b(str)\b\s?

那么该死的"又可以回来了...

问题就是这样的吧

难道我还得特意用 | 多写出行首和行末的匹配?

zh__ua 2006-09-24
  • 打赏
  • 举报
回复
这里有一个问题是,就是如果只有一个空格,并且后面的也没有引号的话,就匹配不了,可以自己处理匹配位置,也可以用(\s)?\b试试,但不知会不会有别的问题,自己试吧,我感觉这方法可行,关键是多想一下可能出现的情况,然后在程序中开始就处理了就行了
zh__ua 2006-09-24
  • 打赏
  • 举报
回复
那就按我上面说的那种做吧,不知你理解我上面说的想法了没
GDPudding 2006-09-24
  • 打赏
  • 举报
回复
我试过

\b可以匹配上"

\s\b倒没试过

先作个小试验...

广告时间

很快回来....
GDPudding 2006-09-24
  • 打赏
  • 举报
回复
晕,把你最初需求说出来好吧


---------------------------------------------------------------

我就是在自己做一个基于Js的DOM操作语法高亮插件时遇上了上面的问题

比如我本想把关键字var改成<span id="keyword">var</span>

却顺便也把 "var" 改成了<span id="string">"<span id="keyword">var</span>"</span>

这样说明白么?
zh__ua 2006-09-24
  • 打赏
  • 举报
回复
如果你只是以空格分隔,然后加自己的格式字符,可以用下面的思路,程序你自己写吧
对非引号分隔字符用 \s\b和\b\s 判断单词是否结束,开头,结尾单独判断或用^$判断
对用引号的用\"\b和\b\"判断,
直接替换就行了,顺序肯定一样
GDPudding 2006-09-24
  • 打赏
  • 举报
回复
比如说这样一个字符串
var str = "aabbcc \"ccccc\" dddd qqqq eeee \"wwwwee\" \"wwqwwqw\" aaaasd 'asdsadw' poqwep \"asdasdasd\" asdsadasd \"aaa\" aaa";
楼主到底想得到什么?
是a = ["aabbcc","dddd","qqqq", ... "aaa"]
b = ["ccccc","wwwwee","wwqwwqw","aaa"]这两个Array,可以这样理解吗?
如果str中出现两个aaa或者两个"aaa"怎样处理?
=---------------------------------------------=

如果是单纯得到这两个Array那就不好复原顺序了...

关于数组当时我还想过多维,然后其中一维记录排位(RegExp的index属性),再用Array的sort排一排

貌似原理上可以实现,但是效果还是不好吧...

目前最想是有达人写出提取或者是替换(或者叫插入吧)的一个(最好不过,只是不现实了)或者多个正则式

谢谢大家关注
GDPudding 2006-09-24
  • 打赏
  • 举报
回复
此问题好解决啊,用java的话用str.split("(\"|'|\\s+)+");
用javascript的话用str.split(/("|'|\s+)+/);
得到的结果都是String的数组,然后挨个取就行了

--------------------------------------------------------------

如果是这种办法的话效率的确不高

处理一组字符串还可以

谢谢意见....
zh__ua 2006-09-24
  • 打赏
  • 举报
回复
晕,把你最初需求说出来好吧
GDPudding 2006-09-24
  • 打赏
  • 举报
回复
再强调一下下

取出来的(或者是替换后),除加插的字符,顺序要和原来一样

而不只是单单取出
GDPudding 2006-09-24
  • 打赏
  • 举报
回复
应该说是想得到引号内和引号外的分开处理,重复无所谓

因为我只是对其分开处理

最后重新按原来顺序组合成处理过后的字符串

比如

var str = "aabbcc \"ccccc\" dddd qqqq eeee \"wwwwee\" \"wwqwwqw\" aaaasd 'asdsadw' poqwep \"asdasdasd\" asdsadasd \"aaa\" aaa";


我想处理后会变成这样
alert(str_rebuild)

->

[A]aabbcc[/A] [B]"ccccc"[/B] [A]dddd[/A] [A]qqqq[/A] [A]eeee[/A] [B]"wwwwee"[/B] [B]"wwqwwqw"[/B] [A]aaaasd[/A] [B]'asdsadw'[/B] [A]poqwep[/A] [B]"asdasdasd"[/B] [A]asdsadasd[/A] [B]"aaa"[/B] [A]aaa[/A]

以上是输出结果

我知道直接用replace不好弄,可能会出现
aaa "aaa"
被改成
[A]aaa[/A] [B]"[A]aaa[/A]"[/B]
或者
[A]aaa[/A] "[A]aaa[/A]"
的形式

再说明一点

比如

aaa bbbb cccc

这些只是关键字,均由变量输入,组成特定的正则表达式


直白地说,我想做一个语法高亮的东东,还有就是自动判断缩进(缩进由程序输出,当然像Python这种完全靠缩进解释执行的语言是不加自动的了)
加载更多回复(4)

87,902

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧