求下面的正则表达式

gxingmin 2011-06-03 04:35:23
string str=@"SELECT * ,
( SELECT 1
FROM aaa
)
FROM aaa
WHERE x IN ( SELECT x
FROM bbb )";

用正则计算外面一层(不是括号内的)的SQL语句的select和from的位置
...全文
153 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Daqing 2011-06-09
  • 打赏
  • 举报
回复
幸好杀回来了,唉,group还有index属性啊!孤陋寡闻了
  • 打赏
  • 举报
回复
模糊数学?>
jshzp 2011-06-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tsapi 的回复:]
正则抽取 匹配,没听说可以找到index
[/Quote]
模糊数学当然能得到精确的结果!
q107770540 2011-06-04
  • 打赏
  • 举报
回复
LS V5
LS 荡漾
-过客- 2011-06-04
  • 打赏
  • 举报
回复
这要看你字符串的结构

1、如果()没有嵌套,且最外层的select前不再有(),那么
string str = @"SELECT * ,
( SELECT 1
FROM aaa
)
FROM aaa
WHERE x IN ( SELECT x
FROM bbb )";
Regex reg = new Regex(@"(?is)(select)(?:\([^()]*\)|[^()])*(from)");
Match m = reg.Match(str);
if (m.Success)
{
richTextBox2.Text += "匹配内容:" + m.Groups[1].Value.PadRight(8) + "索引:" + m.Groups[1].Index + "\n";
richTextBox2.Text += "匹配内容:" + m.Groups[2].Value.PadRight(8) + "索引:" + m.Groups[2].Index + "\n";
}
/*-----输出-----
匹配内容:SELECT 索引:0
匹配内容:FROM 索引:43
*/


2、如果()没有嵌套,且最外层的select前可能有(),那么需要再加个限定条件
string str = @"SELECT * ,
( SELECT 1
FROM aaa
)
FROM aaa
WHERE x IN ( SELECT x
FROM bbb )";
Regex reg = new Regex(@"(?is)(?<!\([^()]*)(select)(?:\([^()]*\)|[^()])*(from)");
Match m = reg.Match(str);
if (m.Success)
{
richTextBox2.Text += "匹配内容:" + m.Groups[1].Value.PadRight(8) + "索引:" + m.Groups[1].Index + "\n";
richTextBox2.Text += "匹配内容:" + m.Groups[2].Value.PadRight(8) + "索引:" + m.Groups[2].Index + "\n";
}
/*-----输出-----
匹配内容:SELECT 索引:0
匹配内容:FROM 索引:43
*/


3、如果可能有()嵌套,那么要用到平衡组
string str = @"SELECT * ,
( SELECT (1)
FROM aaa
)
FROM aaa
WHERE x IN ( SELECT x
FROM bbb )";
Regex reg = new Regex(@"(?is)(?<!\([^()]*)(select)(?:\((?>\((?<o>)|\)(?<-o>)|[^()]*)*(?(o)(?!))\)|[^()])*(from)");
Match m = reg.Match(str);
if (m.Success)
{
richTextBox2.Text += "匹配内容:" + m.Groups[1].Value.PadRight(8) + "索引:" + m.Groups[1].Index + "\n";
richTextBox2.Text += "匹配内容:" + m.Groups[2].Value.PadRight(8) + "索引:" + m.Groups[2].Index + "\n";
}
/*-----输出-----
匹配内容:SELECT 索引:0
匹配内容:FROM 索引:45
*/

huangwenquan123 2011-06-03
  • 打赏
  • 举报
回复
        
string str = @"SELECT * ,
( SELECT 1
FROM aaa
)
FROM aaa
WHERE x IN ( SELECT x
FROM bbb )";
string result = Regex.Replace(str, @"(?is)\([^\)]+\)", delegate(Match m) { return new string('_', m.Value.ToCharArray().Length); });
Regex reg = new Regex("(?i)select|from");
foreach (Match m in reg.Matches(result))
Response.Write(m.Value + "==" + m.Index + "<br/>");
gxingmin 2011-06-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 q107770540 的回复:]
C# code

void Main()
{
string str=@"SELECT * ,
( SELECT 1
FROM aaa
)
FROM aaa
WHERE x IN ( SELECT x
FROM bbb )";
var query=str.Split().Select((s,index)=>new{key=index,value=s}……
[/Quote]

呵呵,楼上辛苦了,查找位置的算法我已经实现了,其实我一开始想用正则来找,但是搞了半天没搞出来,就改用其他方式了,我开这帖子的目的就是想找个正则表达式出来。。。。。。
q107770540 2011-06-03
  • 打赏
  • 举报
回复

void Main()
{
string str=@"SELECT * ,
( SELECT 1
FROM aaa
)
FROM aaa
WHERE x IN ( SELECT x
FROM bbb )";
var query=str.Split().Select((s,index)=>new{key=index,value=s});
var left=query.FirstOrDefault(q=>q.value=="(").key;
var bottom=query.FirstOrDefault(q=>q.value==")"&&q.key>left).key;
var right=query.LastOrDefault(q=>q.value=="(").key;
Console.WriteLine("Before Query:");
query.ToList().ForEach(q=>Console.WriteLine("{0}:\t{1}",string.IsNullOrEmpty(q.value)?"BLANK":q.value,q.key));
var result=from q in query
where (q.value=="SELECT" && q.key<left)
||(q.value=="FROM" && q.key>bottom && q.key <right)
select q;
Console.WriteLine("After Query:");
result.ToList().ForEach(q=>Console.WriteLine("{0}:\t{1}",q.value,q.key));

/*
Before Query:
SELECT: 0
*: 1
,: 2
BLANK: 3
BLANK: 4
BLANK: 5
(: 6
SELECT: 7
1: 8
BLANK: 9
BLANK: 10
BLANK: 11
FROM: 12
aaa: 13
BLANK: 14
BLANK: 15
BLANK: 16
): 17
BLANK: 18
FROM: 19
aaa: 20
BLANK: 21
WHERE: 22
x: 23
IN: 24
(: 25
SELECT: 26
x: 27
BLANK: 28
BLANK: 29
BLANK: 30
FROM: 31
bbb: 32
): 33
After Query:
SELECT: 0
FROM: 19

*/
}
gxingmin 2011-06-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 tsapi 的回复:]
正则抽取 匹配,没听说可以找到index
[/Quote]

现在听说过了吧
正则匹配是能找到index的
一直在冬眠 2011-06-03
  • 打赏
  • 举报
回复
不会哎 帮你顶下
Daqing 2011-06-03
  • 打赏
  • 举报
回复
正则抽取 匹配,没听说可以找到index
gxingmin 2011-06-03
  • 打赏
  • 举报
回复
对,就是外层sql语句的这两个单词的index
整个sql语句不固定,要用正则

不要用查找的方式
q107770540 2011-06-03
  • 打赏
  • 举报
回复
string str=@"SELECT * ,
( SELECT 1
FROM aaa
)
FROM aaa
WHERE x IN ( SELECT x
FROM bbb )";

你是要找这两个单词的INDEX么?
gxingmin 2011-06-03
  • 打赏
  • 举报
回复
比方说上面的例子select的位置是0
from的位置是大概在30左右
gxingmin 2011-06-03
  • 打赏
  • 举报
回复
不去括号里的,就是计算最外层的select和from在这个字符串中的位置(第几个字符)
porschev 2011-06-03
  • 打赏
  • 举报
回复

计算外面一层。。select和form的位置?

什么意思?

先去掉括号里的。。再看select和form在字符串中的索引?
快溜 2011-06-03
  • 打赏
  • 举报
回复
Airch 2011-06-03
  • 打赏
  • 举报
回复
不会写,关注下

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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