java正则表达式求助,正则表达式截取子串

aio_o 2013-10-28 10:55:30
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class test {
static int i1 = 0;
public static String GetTableName(String SQL,String regex){
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(SQL);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
System.out.println(SQL);
System.out.println("rod: (" + matcher.start() + ", " + matcher.end() + ")");
System.out.println("sub: " + SQL.substring(matcher.start(), matcher.end()));
matcher.appendReplacement(sb, "");
}
matcher.appendTail(sb);
return null;
}

public static void main(String[] args) throws IOException{
String SQL1="create \n table \n \r t1 (tc1 int primary key, tc2 int) enable primary key using index";
String regex_ct="create(\\s*)table(\\s*)(\\w*)(\\s*)\\(";
GetTableName(SQL1,regex_ct);
}
}

我想让这个函数返回regex_ct中“(\\w*)”所代表的名字,何解?
当字符串中有多个空格、回车、换行符或使用不同的表名时,依然能返回表名...
求大神帮忙,不太熟悉正则表达式....
...全文
259 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
aio_o 2013-10-29
  • 打赏
  • 举报
回复
"?"和group是对应使用的么?第几个"?"就对应group(几)? 我试试。 多谢大家
tony4geek 2013-10-29
  • 打赏
  • 举报
回复
不知道你那些换行是自动产生还是什么。你也可以把那些特殊的换行先去除。没有的话试试这个。
String SQL1 = "create   table   t1   (tc1 int primary key, tc2 int) enable primary key using index";
		Matcher m2 = Pattern.compile("(?<=table).*?(?=\\()").matcher(SQL1);
		while (m2.find()) {
			System.out.println("---"+m2.group(0).trim()+"------");
		}
基础学起 2013-10-29
  • 打赏
  • 举报
回复
String sql="create \n table \n \r \t\r\n t1 \t (tc1 int primary key, tc2 int) enable primary key using index"; String regex="((?i)create)\\s*((?i)table)\\s*(.*?)\\s"; Matcher m = Pattern.compile(regex).matcher(sql); if(m.find()){ System.out.println(m.group(3)); }
末日哥 2013-10-29
  • 打赏
  • 举报
回复
在你的基础上改的
public class test {
	public static String GetTableName(String SQL,String regex){
			Pattern pattern = Pattern.compile(regex); 
			Matcher matcher = pattern.matcher(SQL);
			while (matcher.find()) { 
				return matcher.group(3);
	        } 
		return null;
	}
	
	public static void main(String[] args){
		String SQL1="create  \n table   \n \r    t1   (tc1 int primary key, tc2 int) enable primary key using index";
		String regex_ct="create(\\s*)table(\\s*)(\\w*)(\\s*)\\(";
		System.out.println(GetTableName(SQL1,regex_ct));
	}
}
小绵羊 2013-10-29
  • 打赏
  • 举报
回复

String sql="create  \n table   \n \r  \t\r\n  t1 \t  (tc1 int primary key, tc2 int) enable primary key using index";
        String regex="((?i)create)\\s*((?i)table)\\s*(.*?)\\s";
        
        Matcher m = Pattern.compile(regex).matcher(sql);
        
        if(m.find()){
        	System.out.println(m.group(3));
        }
失落夏天 2013-10-29
  • 打赏
  • 举报
回复
引用 4 楼 aio_o 的回复:
[quote=引用 2 楼 ghostkngiht 的回复:] 不用正则表达式应该也可以。

        String sql = "create  \n table   \n \r    t1   (tc1 int primary key, tc2 int) enable primary key using index";
        int index = sql.toLowerCase().indexOf("table");
        if (index != -1) {
            String temp = sql.substring(index + 5).trim();
            index = temp.indexOf(" ");
            if (index != -1) {
                System.out.println("表名:"+temp.substring(0, index));
            } else {
                System.out.println("错误的SQL");
            }
        } else {
            System.out.println("错误的SQL");
        }
不是这么简单的,几百亿条语句,我写出一条,只是实例,“create \n table \n \r t1 ”关键字之间的空格、回车、换行符千差万别,不是一成不变的,所以我只能用正则表达式里的(\\s*)来表示[/quote] 解决这个问题的关键不是正则怎么写,而是你能否找出来适用的规律。。。 没有规律正则肯定是写不出来的。 正则最前面加 (?s) 可以无视换行。 根据你说的这些如果只是提取t1的话 可以如下这样:

String SQL1="create  \n table   \n \r    t1   (tc1 int primary key, tc2 int) enable primary key using index";
	      String regex_ct="(?s)create.*?table.*?(\\w+).*?";
	      Matcher m = Pattern.compile(regex_ct).matcher(SQL1);
	      while(m.find()){
	    	  System.out.println(m.group(1));
	      }
aio_o 2013-10-29
  • 打赏
  • 举报
回复
引用 2 楼 ghostkngiht 的回复:
不用正则表达式应该也可以。

        String sql = "create  \n table   \n \r    t1   (tc1 int primary key, tc2 int) enable primary key using index";
        int index = sql.toLowerCase().indexOf("table");
        if (index != -1) {
            String temp = sql.substring(index + 5).trim();
            index = temp.indexOf(" ");
            if (index != -1) {
                System.out.println("表名:"+temp.substring(0, index));
            } else {
                System.out.println("错误的SQL");
            }
        } else {
            System.out.println("错误的SQL");
        }
不是这么简单的,几百亿条语句,我写出一条,只是实例,“create \n table \n \r t1 ”关键字之间的空格、回车、换行符千差万别,不是一成不变的,所以我只能用正则表达式里的(\\s*)来表示
aio_o 2013-10-29
  • 打赏
  • 举报
回复
引用 1 楼 fudongrifdr 的回复:
你是想返回t1?
嗯,是t1
ghostkngiht 2013-10-28
  • 打赏
  • 举报
回复
不用正则表达式应该也可以。

        String sql = "create  \n table   \n \r    t1   (tc1 int primary key, tc2 int) enable primary key using index";
        int index = sql.toLowerCase().indexOf("table");
        if (index != -1) {
            String temp = sql.substring(index + 5).trim();
            index = temp.indexOf(" ");
            if (index != -1) {
                System.out.println("表名:"+temp.substring(0, index));
            } else {
                System.out.println("错误的SQL");
            }
        } else {
            System.out.println("错误的SQL");
        }
末日哥 2013-10-28
  • 打赏
  • 举报
回复
你是想返回t1?
1.运行环境 本书7~10章所附代码的运行环境 Windows家族,.NET Framework 2.0及以上版本 IIS 5.0及以上版本 本书14~16章所附代码的运行环境 Windows家族,Apache 2.0及以上版本 PHP 5.0及以上版本 本书17~18章所附代码的运行环境 Windows家族,Tomcat JDK6.0 本书19~21章所附代码的调试环境 IE 6.0及以上版本 2.调试环境 本书7~10章所附代码的调试环境 Windows家族,.NET Framework 2.0及以上版本 Visual Studio 2005及以上版本、ASP.NET 2.0及以上版本 本书14~16章所附代码的调试环境 Windows家族,Apache 2.0及以上版本 PHP 5.0及以上版本 本书17~18章所附代码的调试环境 JDK6.0 Eclipse3.2+Lomboz 本书19~21章所附代码的调试环境 IE 6.0及以上版本 文本编辑器 3.本书所附光盘范例 第7章(/07/) DataTypeApplication/Default.aspx 检查和转换数据 第8章(/08/) StringApplication/StringDealwith.aspx 字符串处理 StringBuilderApplication/DealWithStringBuilder.aspx 动态字符串处理 第9章(/09/) RegexApplication/Default.aspx 正则表达式类的应用 RegexApplication/GetPageHtmlData.aspx 获取网页的内容 第10章(/10/) ASPNETValidator/Compare.aspx 比较验证 ASPNETValidator/CompareCheck.aspx 数据类型检查 ASPNETValidator/CompareValue.aspx 值比较验证 ASPNETValidator/CustomClient.aspx 自定义客户端验证 ASPNETValidator/CustomServer.aspx 自定义服务器端验证 ASPNETValidator/NotNull.aspx 非空验证 ASPNETValidator/NotNullInitValue.aspx 不等于初始化值的验证 ASPNETValidator/RangeDate.aspx 日期范围验证 ASPNETValidator/RangeInt.aspx 整数范围验证 ASPNETValidator/RangeLetter.aspx 字母范围验证 ASPNETValidator/REDate.aspx 日期格式验证 ASPNETValidator/REEmail.aspx 电子邮件格式验证 ASPNETValidator/REIdentity.aspx 身份证号码格式验证 ASPNETValidator/REInt.aspx 整数格式验证 ASPNETValidator/RENumber.aspx 数值格式验证 ASPNETValidator/REPhone.aspx 电话号码格式验证 ASPNETValidator/REUrl.aspx URL地址格式验证 ASPNETValidator/SummaryDialog.aspx 对话框式验证摘要 ASPNETValidator/SummaryPage.aspx 网页式验证摘要 第11章(/11/) 判断是否为对象.asp 判断是否为对象 判断是否为数值.asp 判断是否为数值 判断是否为数组.asp 判断是否为数组 判断是否为日期.asp 判断是否为日期 判断是否为空.asp 判断是否为空 判断是否为空值.asp 判断是否为空值 获取变量类型信息.asp 获取变量类型信息 第12章(/11/) 从中截取字符串.asp 从中截取字符串 切分字符串.asp 切分字符串 删除字符串前后导空格.asp 删除字符串前导空格.asp 删除字符串后导空格.asp 反向截取字符串.asp 反向查找字符串.asp 字符串倒序排列.asp 字符串大写转化.asp 字符串小写转化.asp 字符串替换.asp 将数组元素连接为字符串.asp 构造制定字符串.asp 正向截取字符串.asp 正向查找字符串.asp 获取字符串长度.asp 第13章(/14/) Matches集合与Macth对象.asp 指定忽略大小写.asp 获取Matches集合.asp 进行正则匹配替换.asp 进行正则匹配检验.asp 第14章(/14/) 浮点型数据测试.php 浮点型数据测试 字符串数据测试.php 字符串数据测试 数组数据测试.php 数组数据测试 对象测试.php 对象测试 数据类型识别.php 数据类型识别 强制类型转化.php 强制类型转化 计算圆周面积程序.php 计算圆周面积程序 字符串转化.php 字符串转化 数值转化.php 数值转化 数组转化.php 数组转化 第15章(/15/) 计算字符串的长度.php 计算字符串的长度 访问单个字符.php 访问单个字符 检索字符的位置.php 检索字符的位置 截取子字符.php 截取子字符 查找字符串出现的次数.php 查找字符串出现的次数 替换子字符串.php 替换子字符串 按照特定字符进行分割.php 按照特定字符进行分割 按照指定数目进行分割.php 按照指定数目进行分割 删除字符串的空白.php 删除字符串的空白 字符串的填补.php 字符串的填补 字符串大小写的转换.php 字符串大小写的转换 字符串的反转.php 字符串的反转 字符串按ASCII码顺序比较.php 字符串按ASCII码顺序比较 字符串按“自然排序”法比较.php 字符串按“自然排序”法比较 根据单词的发音比较.php 根据单词的发音比较 根据单词的相似性比较.php 根据单词的相似性比较 查找子字符串.php 查找子字符串 搜寻出现的字符.php 搜寻出现的字符 字符匹配.php 字符匹配 字符替换.php 字符替换 字符串翻译.php 字符串翻译 格式化数字.php 格式化数字 格式化表单字符串.php 格式化表单字符串 24.php 格式化字符串 25.php 格式化HTML实体 26.php HTML标签的清理 解析URL字符串.php 解析URL字符串 解析查询字符串.php 解析查询字符串 URL编码处理.php URL编码处理 查询字符串的构造.php 查询字符串的构造 第16章(/16/) 字符串模式匹配.php 字符串模式匹配 字符串大小模式匹配.php 字符串大小模式匹配 日期字符串模式匹配.php 日期字符串模式匹配 模式替换.php 模式替换 模式分割.php 模式分割 正则表达式匹配.php 正则表达式匹配 其他的正则表达式匹配.php 其他的正则表达式匹配 取得正则表达式的全部匹配.php 取得正则表达式的全部匹配 返回与模式匹配的数组单元.php 返回与模式匹配的数组单元 正则表达式的替换.php 正则表达式的替换 正则表达式的拆分.php 正则表达式的拆分 表单验证.php 表单验证 UBBCode.php UBB代码 ubb.html UBB代码输入界面 ubb.php UBB代码输出界面 Apache日志分析.php Apache日志分析 第17章(/17/) JSPExample1.jsp JSP页面中整型数据的使用 JSPExample2.jsp JSP页面中循环输出整型数据 JSPExample3.jsp 计算一光年的距离 JSPExample4.jsp JSP页面中计算圆的面积 JSPExample5.jsp JSP页面中字符数据的简单使用 JSPExample6.jsp 结合布尔类型变量判断学生成绩等级 JSPExample7.jsp text.html页面提交至该页,并显示提交数据 text.html 页面数据提交至JSPExample7.jsp JSPExample8.jsp 不同类型混合运算自动转换 JSPExample9.jsp 不同类型混合运算强制转换 JSPExample10.jsp 字符串类型与其他数据类型的转换 JSPExample11.jsp 解析字符串的子字符串 stringOP.html 页面数据提交至JSPExample12.jsp JSPExample12.jsp 字符串替换 JSPExample13.jsp 字符串大小写转换、反转等操作 logon.html 页面数据提交至JSPExample14.jsp JSPExample14.jsp 字符串数据的比较 JSPExample15.jsp 字符串数据的连接 JSPExample16.jsp 字符串数据的格式化 第18章(/18/) 1.jsp Pattern对象使用split方法示例一 2.jsp Pattern对象使用split方法示例二 3.jsp Matcher对象使用appendReplacement方法示例 4.jsp Matcher对象使用groupCount方法示例 5.jsp Matcher对象使用find方法示例 6.jsp Matcher对象使用group方法示例 7.jsp 字符串对象使用split方法 8.jsp Matcher对象使用replaceAll方法示例 9.html 页面数据提交至9.jsp 9.jsp 利用正则表达式验证邮箱地址 10.html 页面数据提交至10.jsp 10.jsp 利用正则表达式验证URL地址 11.html 页面数据提交至11.jsp 11.jsp 利用正则表达式验证电话号码 第20章(/20/) 从字符串中提取子串(1).html 从字符串中提取子串(1) 从字符串中提取子串(2).html 从字符串中提取子串(2) 从字符串中提取子串(3).html 从字符串中提取子串(3) 删除或替换数组中部分数据.html 删除或替换数组中部分数据 删除数组中最后一个元素.html 删除数组中最后一个元素 删除数组中的第一个元素.html 删除数组中的第一个元素 反序排列数组中的元素.html 反序排列数组中的元素 在字符串上加入超级链接.html 在字符串上加入超级链接 在字符串两端加上小字体标记.html 在字符串两端加上小字体标记 在字符串两端加入上标标签.html 在字符串两端加入上标标签 在字符串两端加入下标标签.html 在字符串两端加入下标标签 在字符串两端加入斜体标签.html 在字符串两端加入斜体标签 在字符串两端加入锚点标志.html 在字符串两端加入锚点标志 在字符串的两端加上固定宽度字体标记.html 在字符串的两端加上固定宽度字体标记 在字符串的两端加上粗体标志.html 在字符串的两端加上粗体标志 在字符串的两端加入下划线标记.html 在字符串的两端加入下划线标记 在指定字符串的两端加上大字体标志.html 在指定字符串的两端加上大字体标志 在数组前面插入数据.html 在数组前面插入数据 对数组中的元素进行排序.html 对数组中的元素进行排序 将一个或多个字符串连接到当前字符串的末尾.html 将一个或多个字符串连接到当前字符串的末尾 将字符串分割并存储到数组中.html 将字符串分割并存储到数组中 将字符串转化为大写格式.html 将字符串转化为大写格式 将字符串转化为小写格式.html 将字符串转化为小写格式 将指定的数据添加到数组中.html 将指定的数据添加到数组中 将数组元素连接为字符串.html 将数组元素连接为字符串 替换字符串中指定的内容.html 替换字符串中指定的内容 根据指定的Unicode编码返回一个字符串.html 根据指定的Unicode编码返回一个字符串 比较两个字符串的大小.html 比较两个字符串的大小 获取字符串的长度.html 获取字符串的长度 获取指定位置的字符的Unicode编码.html 获取指定位置的字符的Unicode编码 获取指定字符(串)第一次在字符串中出现的位置.html 获取指定字符(串)第一次在字符串中出现的位置 获取数组中的一部分数据.html 获取数组中的一部分数据 设置字符串输出时的前景色.html 设置字符串输出时的前景色 设置字符串输出时的字体大小.html 设置字符串输出时的字体大小 返回一个包含数组中全部数据的字符串.html 返回一个包含数组中全部数据的字符串 返回字符串中指定位置处的字符.html 返回字符串中指定位置处的字符 连接其他数组到当前数组末尾.html 连接其他数组到当前数组末尾 第21章(/21/) 判断字符串中是否存在匹配内容.html 判断字符串中是否存在匹配内容 对字符串进行匹配检测.html 对字符串进行匹配检测 替换字符串中的指定内容.html 替换字符串中的指定内容 编译正则表达式.html 编译正则表达式 获取与正则表达式进行匹配检测的字符串.html 获取与正则表达式进行匹配检测的字符串 获取匹配内容右侧的字符信息.html 获取匹配内容右侧的字符信息 获取匹配内容左侧的字符信息.html 获取匹配内容左侧的字符信息 获取匹配的内容的最后一个索引位置.html 获取匹配的内容的最后一个索引位置 获取子匹配的结果.html 获取子匹配的结果 获取字符串中所有的匹配信息.html 获取字符串中所有的匹配信息 获取最近一次匹配的内容.html 获取最近一次匹配的内容 获取最近一次匹配的最后一个子匹配.html 获取最近一次匹配的最后一个子匹配 获取第一次匹配的起始位置(1).html 获取第一次匹配的起始位置(1) 获取第一次匹配的起始位置(2).html 获取第一次匹配的起始位置(2)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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