字符串不是正则表达式

上个月写那段处理CVS文件中的逗号的小程序时,顺便写了个测试程序。测试程序先读一“|”分割字段的文件。我们原来的程序中,都是使用Java中的 StringTokenizer 类来处理读入的每行数据。我的测试程序中改用String.split()方法,但是处理一“|”分割字段的文件总是不正确。换成其它分隔符或者使用StringTokenizer就没问题。墨迹了好长时间也没找出问题。

“大事不决问Google,内事不决问老婆”。老婆是指望不上了,她是做会计工作的。只好问Google。随便看了一篇文章,还没看完,就明白是怎么回事了:把正则表达式当字符串用了。

先来看一下class StringTokenizer constructorConstructs a string tokenizer for the specified string.

StringTokenizer(String str, String delim) 

第一个String是要处理的字符串,第二个String是字符串中使用的分隔符。如果省略第二个参数,缺省的分隔符是空格。创建一个StringTokenizer对象,然后使用它的hasMoreTokens()和nextToken()方法来获得分隔好的字段。

再来看一下class String 中的split方法:Splits this string around matches of the given regular expression.

public String[] split(String regex) 

这个方法比StringTokenizer要方便一些,分隔后的字段直接存到一个String数组中。只要把分隔符当做参数传给这个方法就行了。

但是,split方法需要的不是一个普通的字符串,它需要一个正则表达式作为参数。在我的程序中,我直接使用string.split(“|”),想使用“|”作为分隔符。正巧,“|”是正则表达式中的元字符,它是有特殊含义的:它是一个或表达式。如果你只是想找“|”,就必须使用“\”取消它的特殊含义。在正则表达式中,你必须写成“\|”。但是当你把这样一个正则表达式传给split方法时,这个方法又不认了,因为“\”在Java string 中是有特殊含义的,你必须再使用一个"\"来转义。所以最后传给split的参数是“\\|”。

什么叫祸不单行啊。还没高兴一会儿,又被正则表达式绊倒了。

我需要一个用字符串替换字符串的方法,在API中找了一下,还真找着了:

public String replaceAll(String regex, String replacement)

这个方法可以:Replaces each substring of this string that matches the given regular expression with the given replacement.

但是,不好用啊,什么都没替换掉。郁闷半天,发现自己在同一个地方又跌倒了一回。replaceAll方法参数需要的也是正则表达式。

在Java使用正则表达式,因为Java也有转义字符("\"),会使得一些表达是看上去很奇怪。比如,要在正则表达式中表示一个字符"\",必须在这个字符前面再加个"\",因为"\"是元字符,必须使用转义字符"\"来取消它的特殊含义。这样,在正则表达式中就会出现两个"\"。到了Java那里,又需要使用Java的转义字符"\"来转义,于是每个"\"前面再加一个“\",这样就变成了4个"\"。麻烦吧。

(这是一篇老博文,11-1-31 下午4:18 发布在Google Blogger上。但我只是几年前在那里发了几篇文章,早已经不维护了,干脆把看得上眼的文章搬过来算了)

时间: 2024-10-27 07:23:12

字符串不是正则表达式的相关文章

PHP字符串处理与正则表达式

字符串 1. PHP中的字符串是一种基本数据类型,PHP对unicode没有本地支持. 2. 字符串可以可以通过花括号来访问每一个字符,并且每个花括号只能存放一个字符: ? ? $str = 'abcd';? ? $str{1} = 'change it';? ? echo $str; // accd 3. 双引号中变量内插解析,在双引号中的内容会被解析为字符串, ? ? 如果遇到$符号,则会贪婪解析一个尽可能多的合法变量名,使用花括号可以将变量名括起来: ? ? 在双引号中解析数组索引或者对象

【原】Java学习笔记023 - 字符串缓冲区_正则表达式

1 package cn.temptation; 2 3 import java.util.Arrays; 4 5 public class Sample01 { 6 public static void main(String[] args) { 7 // 因为字符串创建后就不能修改,导致在进行字符串拼接时,会产生大量的中间字符串,创建对象都是需要消耗资源 8 // 所以,能不用字符串的直接拼接尽量不使用 9 10 // 字符串缓冲区:StringBuffer类/StringBuilder类

第四章 字符串操作与正则表达式(5)

******** 4.6 正则表达式的介绍 (from book < PHP & MySQL Web Development>)PHP 支持两种格式的正则表达式语法:POSIX 和 Perl.用途:完成复杂的模式匹配.难度:难******** 4.6.1 基础知识 ****** 定义:正则表达式是一种描述一段文本模式的方法. 类比:strstr()函数,是在一个字符串的某个位置(如果不指明则可能在字符串中的任何位置)匹配另一个字符串. 例子:字符处"shop"匹配正

Day3_字符串操作与正则表达式

本节课的主要内容有:字符串的格式化.连接与分割.比较.匹配和替换.使用正则表达式 字符串的格式化: 去除空格:trim() 使用html格式化:nl2br()  替换‘\n’为‘<br />’ 打印格式化:printf() 大小写:strtoupper() strtolower() ucfirst() ucwords() 特殊字符转义:addlashes() striplashes() 连接与分割字符串 按指定分隔符分隔:explode() 分隔字符串到数组; strtok()查找当前分隔出的

字符串处理利器-正则表达式

正则表达式 一.常见的符号的介绍 1.1 预定义字符类 符号 说明 . 任何字符(与行结束符可能匹配也可能不匹配) \d 数字:[0-9] \D 非数字: [^0-9] \s 空白字符:[ \t\n\x0B\f\r] \S 非空白字符:[^\s] \w 单词字符:[a-zA-Z_0-9] \W 非单词字符:[^\w] **** 转义字符,比如"\"匹配"" ,"{"匹配"{". 1.2 数量词 符号 说明 * 等价于{0,}

字符串处理与正则表达式

功能:将cmd中的netstat -n的输出作为原始字符串做整理. import console var f = io.popen("netstat -n" ) var str = f.read( -1 ); //直接输出中文会乱码,所以先转换 str2 = string.fromto(str,936,65001) f.close(); io.open(); //打开控制台 //io.print(str2); //输出全部结果 var m1 = string.match(str2,&q

具有相同模式的字符串,使用正则表达式组的提取和替换的案例

对具有相同模式的字符串内不同的组的提取怎样做呢,我是这样做的: 提取字符串:sourcetext:{name:john,data:[1,2,3],name:marry,data:[4,5,6]} 代码: Regex reg = new Regex(@"data:\[([\w|.|,]{1,})\]", RegexOptions.IgnoreCase); MatchCollection matches = reg.Matches(series); foreach (Match match

delphi验证‘数字字符串’地址的正则表达式验证function

uses PerlRegEx; function CheckSortKey(SortKey:string):Boolean;//验证排序数字字符串var PerlRegEx: TPerlRegEx;begin PerlRegEx := TPerlRegEx.Create(nil); PerlRegEx.Subject := SortKey; PerlRegEx.RegEx := '^\d{10}$'; Result := PerlRegEx.Match; PerlRegEx.Free; end;

开发小计之判断输入字符串类型(正则表达式)

#pragma mark - 正则表达式 - (BOOL)isMobileNumber:(NSString *)mobileNum { /** * 手机号码 * 移动:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188 * 联通:130,131,132,152,155,156,185,186 * 电信:133,1349,153,180,189 */ NSString * MOBILE = @"^1(3[0-9]|5[0-35-