`
RednaxelaFX
  • 浏览: 3049398 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

见《java字符串解析》,联想

阅读更多
JavaEye问答:java字符串解析

本来想回那帖的,但从学校坐了趟公交回到住处那问题就已经关闭了 T T
其实我是想说,这问题用正则表达式解决是如此的简单……因为那帖给的字符串是有规律的:带有相同数字的项是相邻的

例如说用Ruby的话,在irb里测试一下:
irb(main):001:0> src = '22:w,22:c,21:r,7:r,7:w,7:c,8:w,8:c,8:d,9:r,9:w,9:c,9:d,10:r'
=> "22:w,22:c,21:r,7:r,7:w,7:c,8:w,8:c,8:d,9:r,9:w,9:c,9:d,10:r"
irb(main):002:0> re = /((\d+):\w(,\2:\w)*),/
=> /((\d+):\w(,\2:\w)*),/
irb(main):003:0> expected_result = '22:w,22:c;21:r;7:r,7:w,7:c;8:w,8:c,8:d;9:r,9:w,9:c,9:d;10:r'
irb(main):004:0> result = src.gsub re, '\1;'
=> "22:w,22:c;21:r;7:r,7:w,7:c;8:w,8:c,8:d;9:r,9:w,9:c,9:d;10:r"
irb(main):005:0> result == expected_result
=> true


也就是说那个问题用一行代码的函数就能解决:
def reformat(src)
  src.gsub /((\d+):\w(,\2:\w)*),/, '\1;'
end


即便用Java也仍然是同样的简单:
public class TestRegex {
    public static String reformat(String src) {
        return src.replaceAll("((\\d+):\\w(,\\2:\\w)*),", "$1;");
    }
    
    public static void main(String[] args) {
        String src = "22:w,22:c,21:r,7:r,7:w,7:c,8:w,8:c,8:d,9:r,9:w,9:c,9:d,10:r";
        String expected = "22:w,22:c;21:r;7:r,7:w,7:c;8:w,8:c,8:d;9:r,9:w,9:c,9:d;10:r";
        String result = reformat(src);
        System.out.println(result.equals(expected));
    }
}


当然如果输入的字符串没有上述的特殊属性就无法保证这个方法的正确性了。只不过我猜那个问题原本作为源的字符串就是从什么别的程序输出得到的,或许本来就有这样的规律,值得利用。
分享到:
评论
2 楼 RednaxelaFX 2008-12-11  
呵呵,印象中在CSDN没注册,那边貌似不注册回不了,就算了。
不介意的话,这里稍微解释一下上面的正则表达式:
Ruby写法:
/((\d+):\w(,\2:\w)*),/

这代表一个正则表达式常量。两个斜杠('/')之间的是正则表达式的内容。
Java的写法与其十分相似:
new Pattern("((\\d+):\\w(,\\2:\\w)*),")

Java里正则表达式是用java.util.regex.Pattern对象来表示的,用一个String来表示正则表达式的内容。注意到由于字符串里反斜杠('\')是转义字符,需要写成两个反斜杠("\\")才可以表示正则表达式里的一个反斜杠。就内容来看,这里Ruby跟Java的正则表达式都是一样的。它们使用的都是大致上与Perl的正则表达式兼容的记法。

在这种记法里,\d能匹配一个数字(也就是[0-9]),\w能匹配一个单词字符(也就是[_0-9a-zA-Z]);+代表匹配次数为一次或更多次,*代表匹配次数为零次或更多次;圆括号(())代表一个捕获分组,捕获分组根据其左括号出现的顺序而编号。这个例子里出现的其它字符都是普通字符,直接用于匹配。

也就是说,\d能够匹配0到9的任意一个字符。但事先无法确定这个问题中作为编号的数字有多长,所以用\d+来匹配任意长度大于或等于1的数字;把这个\d+用圆括号括起来是为了后面能够使用捕获到的值。
接下来是冒号(':'),就是用来匹配冒号。\w用来匹配一个单词字符(这个限制可能松了点,或许应该用[a-z]的,但我不清楚那个字符串里可能会出现什么,干脆就松一点了)。
然后又是一个分组。里面先是一个逗号,用于匹配逗号;\2表示这里要匹配之前(\d+)这个分组所捕获到的内容,然后冒号匹配冒号,\w匹配一个单词字符。这个分组后面的星号('*')表示这个分组可以匹配任意多次。
前面的整个表达式外面被一组圆括号包围起来,作为第一个分组。这个分组后面是一个逗号,用于匹配一个逗号。

那么在匹配22:w,22:c,21:r的时候,
首先\d+匹配到了22,捕获为第二个分组;然后:和w依次被匹配。接下来进到可以出现任意多次的分组,先匹配一个逗号,然后是22,然后:和c。再接下来试图匹配逗号之后,21与22不匹配,于是这个分组的匹配就结束了。整个22:w,22:c就被捕获为第一个分组(也就是\1)。最后再把21之前的逗号匹配掉,这个正则表达式的匹配就结束了。
替换的时候,由于先前匹配的捕获分组的信息还保留着,可以用于替换操作。此时被替换的内容是"22:w,22:c,",注意那个逗号也被匹配进去了;替换它的内容是第一个分组的内容外加一个分号:Ruby中的"\1;"或者Java中的"$1;"。没有被替换的内容是21:r。于是替换完成后就变成了"22:w,22:c;21:r"。

这样,应用replaceAll()之类的方法就能把所有连续出现的"数字:字符"序列用分号分开了。

要更详细的了解正则表达式的话,恐怕还是得多读资料多实验一下。我喜欢用Ruby来试正则表达式,主要是因为那个交互式解释器方便。
1 楼 flyong 2008-12-10  
学习了,
上面的正则表达式看不懂,楼主很强,要学习正则了,
http://topic.csdn.net/u/20081209/13/93C87E59-BF06-4FCA-BDC8-D70D2924404D.html

是我在其他地方发的帖子,楼主可以回复一下,就关闭了

相关推荐

    非常实用的一个联想输入提示

    描述中提到的功能更具体地解释了联想输入提示的工作方式:当用户在输入框中键入内容时,系统会实时分析这些字符,并在下方显示出与之匹配的条目供用户选择。这一功能不仅限于单个词,还可能包括短语或完整的句子。...

    java 怎么读取细胞词库scel

    4. **字节转换**:由于scel文件中的字符串可能是UTF-16编码,因此需要将字节流转换为字符串,可能使用`CharsetDecoder`或直接操作字节数组。 5. **错误处理**:处理可能出现的文件不存在、读取异常等情况,并提供...

    js的多用户输入联想提示框

    其中可能包含了事件监听、字符串操作、DOM操作等函数。 4. `search.jsp`: 这可能是一个服务器端的Java页面,用于处理搜索请求,从数据库或其他数据源获取匹配的用户信息,并返回给前端。 5. `参数配置.txt`: 这个...

    联想A760去除拒接回短信图标功能

    去除图标通常需要修改系统的资源文件或应用程序代码,这可能包括修改`resources.arsc`文件,这是一个二进制资源包,存储了应用的所有字符串、颜色、尺寸等资源数据。通过解析并编辑这个文件,可以实现对图标显示的...

    java模式(精华篇)

    接下来,我们设计一个工厂类`Driver`,它包含一个静态方法`driverCar`,根据传入的字符串参数动态返回对应的汽车实例。 通过这种方式,客户只需简单地说“开车”即可,而无需关心具体驾驶的是哪一款车型。`Driver`...

    汉字拼音输入法包含源代码

    在这个案例中,我们可以推测源代码可能是用C++、Java、Python等常见编程语言编写,因为这些语言都具备处理字符串和文本输入的能力。源代码通常包括了读取用户输入、解析拼音、查找对应汉字、显示候选词组和实现...

    android使用的commons.codec包

    这个包主要用于处理字符串、数字和其他数据类型的编码转换,尤其在处理网络通信和数据存储时非常有用。`commons.codec`是Apache Commons项目的一部分,这个项目旨在提供Java编程语言中的实用工具类。 `codec`一词...

    abc 联系代码hello world hello world

    标题中的"abc 联系代码hello world hello world"似乎是一种拼接或者混淆的信息,它可能代表了某个编程过程中的变量、字符串连接或是特定的代码片段。然而,由于信息不够明确,我们无法直接从中获取具体的技术知识点...

    我的全能通讯录

    实现这一功能需要对字符串处理算法有深入理解,例如快速排序或二分查找算法。 再者,强大的"查找"功能是"我的全能通讯录"的一大亮点。它不仅支持关键词搜索,还能根据用户输入的部分信息进行智能联想,快速定位到...

    2021-2022计算机二级等级考试试题及答案No.12019.docx

    - B项中的字符串长度与字长并无直接关系; - C项正确,字长为4个字节(1字节=8位),即32位,意味着计算机能够一次处理32位的数据; - D项表述错误,CPU运行的结果大小并非由字长直接决定。 #### 2. GUI程序中的...

    一款安卓输入法源码

    这部分代码会涉及到字符串处理、哈希表(HashMap)或数组等数据结构的使用,以快速查找对应汉字。 3. **用户界面** 输入法的界面设计和交互体验至关重要。源码中可能包含布局文件(XML)和对应的Java代码,用于...

    中级程序员必备面试题.txt

    - **Redis**:是一个内存数据结构服务器,支持多种数据类型,如字符串、哈希、列表等。Redis可以通过序列化机制将Java对象转换为二进制形式存储。 - **EHCache**:是一个纯Java的缓存实现,主要用于缓存查询结果或...

    安卓T9实体按键中文输入法

    2. **res** 文件夹:存储应用程序的资源文件,如图标、布局文件和字符串等,这些资源可以根据设备的不同配置进行适配。 3. **proguard-project.txt**:ProGuard配置文件,用于混淆代码,保护软件的安全性,减小APK...

    source insight 3.5汉化版

    它可以快速查找指定的函数、变量或字符串,并且提供上下文相关的联想列表,帮助开发者快速找到相关代码,提高工作效率。 4. **代码分析与统计**: 软件可以进行代码统计,如行数、注释比例等,为代码审查提供数据...

    毕业设计论文-源码-打字系统(设计源码.zip

    4. 附加功能:如果系统包含字词联想,可能涉及到字符串匹配算法;错误校正可能使用了自然语言处理技术,如Levenshtein距离算法。 五、设计与实现 在毕业设计中,开发者需要考虑软件工程的整个流程,包括需求分析、...

    russian_tajik_dictionary:塔吉克语<->Android 平台俄语词典

    3. XML:XML用于定义界面布局和资源文件,如字符串、颜色、尺寸等,是Android应用界面设计不可或缺的一部分。 三、功能实现 1. 字典数据库:应用内可能包含一个预先填充的塔吉克语-俄语词汇数据库,支持离线查询,...

    新版Android开发教程.rar

    � Google 提供了一套 Java 核心包 (J2SE 5,J2SE 6) 的有限子集,尚不承诺遵守 Java 任何 Java 规范 , 可能会造 成J ava 阵营的进一步分裂。 � 现有应用完善度不太够,需要的开发工作量较大。--------------------...

    汉堡包

    6. ES6语法:现代JavaScript项目常常采用ES6(ECMAScript 2015)的新特性,如箭头函数、类、模板字符串等,以提高代码的可读性和可维护性。 7. 软件工程实践:良好的代码组织结构、模块化设计、注释以及测试,都是...

Global site tag (gtag.js) - Google Analytics