| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1550 人关注过本帖
标题:把一种语言解释成另一种语言的问题,请教字符串处理高手
只看楼主 加入收藏
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用zklhp在2012-9-7 11:36:00的发言:

接分

(\([^ ]+\)[ ]+in[ ]+\(.+\)) -> (is_in(\1, \2))

如果只是正则表达式替换的话上面的这个可以替换例子 其他的我就没试了

顺便 这个是emacs里写的 貌似和php的正则格式不大一样 这里 \(\) 是引用 ( 就是普通括号 如果环境变了表达式也得相应变

如果对的话不用谢我了 给我七八千的专家分就可以了、、、
2012-09-07 17:50
静夜思
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:济南的冬天
等 级:管理员
威 望:11
帖 子:8913
专家分:2567
注 册:2004-3-25
收藏
得分:0 
以下是引用zklhp在2012-9-7 11:36:00的发言:

接分

(\([^ ]+\)[ ]+in[ ]+\(.+\)) -> (is_in(\1, \2))

如果只是正则表达式替换的话上面的这个可以替换例子 其他的我就没试了

顺便 这个是emacs里写的 貌似和php的正则格式不大一样 这里 \(\) 是引用 ( 就是普通括号 如果环境变了表达式也得相应变

补充

貌似上面的没处理tab 比如下面这样的。。 不过我估计正常人不会写这样的东东



应该能看出来哪是空格 哪是tab罢

那 这个正则貌似可以

(\([^     ]+\)[     ]+in[     ]+\(.+\)) -> (is_in(\1, \2))

emacs里直接打tab就能匹配tab 其他的怎么弄的我也不知道 是\t么 还是上面说的 换环境得根据相应的环境来

坏了 发出来tab变空格了。。。

(\([^ \t]+\)[ \t]+in[ \t]+\(.+\)) -> (is_in(\1, \2))
用这个在线平台演示吧,比较方便
这个确实可以匹配 http://www.

被匹配的括号里面也可能有空格 (A1   +   A2) in (B1+B2),这样就匹配不了了 http://www.

还有可能是括号层层嵌套,在表示优先级的时候经常用到: ((( A1 + A2 )* (A3 + A4))/A5)   in  (B1+B2)
也可能A和B都是函数调用    fun1("((( A1 + A2 )* (A3 + A4))/A5)")    in    fun2("if A in B")

畅所欲言
2012-09-07 18:24
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:20 
回复 12楼 静夜思
如果是带括号的或者是函数调用之类的,用检查括号的匹配性吗?
2012-09-07 19:11
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:20 
in 这个关键字会出现吗?比如
if ( (A in B) in (C in D))
需不需要翻译成:
if ( is_in( is_in(A, B), is_in(C, D) ) )
2012-09-07 19:12
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用静夜思在2012-9-7 18:24:50的发言:

用这个在线平台演示吧,比较方便
这个确实可以匹配 http://www.

被匹配的括号里面也可能有空格 (A1   +   A2) in (B1+B2),这样就匹配不了了 http://www.

还有可能是括号层层嵌套,在表示优先级的时候经常用到: ((( A1 + A2 )* (A3 + A4))/A5)   in  (B1+B2)
也可能A和B都是函数调用    fun1("((( A1 + A2 )* (A3 + A4))/A5)")    in    fun2("if A in B")

越整越复杂 我估计一个正则提不了 还有嵌套in。。。。

工头喊我搬砖去了 你们忙
2012-09-07 19:13
静夜思
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:济南的冬天
等 级:管理员
威 望:11
帖 子:8913
专家分:2567
注 册:2004-3-25
收藏
得分:0 
以下是引用pangding在2012-9-7 19:11:10的发言:

如果是带括号的或者是函数调用之类的,用检查括号的匹配性吗?
用,感觉这是最难的地方,函数调用,函数参数可能是字符串,里面什么字符都有。括号层层嵌套,需要准确找到跟它匹配的那个。

fun1("in or not in, (((   (((((")    in      fun2("(((\"((\'((")

就像一些编辑器的高亮括号功能,光标移动到右括号,左括号同时高亮,哪怕里面有包含的再多层括号。不知道有没有现成的算法。

畅所欲言
2012-09-07 19:14
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:20 
看 12 楼的例子,in 这个关键字会出现。一般这样的问题就不是正则表达式(至少非 perl 的正则)能处理的了。而且静老大举的例子更变态,就是说我们可能还得判断 in 在有些场合并不是关键字(比如在引号里)。
2012-09-07 19:24
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
正则干不了这事,估计得自己实现一个分析器。
2012-09-07 19:25
静夜思
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:济南的冬天
等 级:管理员
威 望:11
帖 子:8913
专家分:2567
注 册:2004-3-25
收藏
得分:0 
想到一个有些笨的方法,定义一个计数器变量,初始值,从左向右,遇到一个左括号加1,遇到一个右括号减1,遇到字符串直接跳过去。当计数器减到0的时候说明找到左括号的匹配括号了。实现起来有些麻烦,如果用正则直接匹配出来就好了。

畅所欲言
2012-09-07 19:29
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
正则表达式就是这么匹配的。只是在描述嵌套括号的时候能力比较弱。

还是感觉正则描述不了这种需求。


[ 本帖最后由 pangding 于 2012-9-7 19:38 编辑 ]
2012-09-07 19:31
快速回复:把一种语言解释成另一种语言的问题,请教字符串处理高手
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017641 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved