200分求拆分字符方法

heavilyarmed 2009-09-23 08:44:13
有一个字符串比如 “if(d3+(j9+m88)/8+43+2+Round(hh99+jj9))”
里面有单纯的 字符(比如:if,还有其他的数学函数),也有 字母数字的组合(比如:m88) ,还有 纯 数字(比如:43)
现在我要把字符串中 字母和数字的组合中的数字( 比如:m88中的88) 都加上7(不固定),变成
“if(d10+(j16+m95)/8+43+2+Round(hh106+jj16))”

我想用substring提取,可是长度不能确定

麻烦帮忙看一下
...全文
511 57 打赏 收藏 转发到动态 举报
写回复
用AI写文章
57 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel6709 2009-09-23
  • 打赏
  • 举报
回复
Regex regx = new Regex(@"(?<=(d|j|m|hh|jj))\d+(?=(\)|\+))");
lvchun012 2009-09-23
  • 打赏
  • 举报
回复
我不太懂哦
heavilyarmed 2009-09-23
  • 打赏
  • 举报
回复
wackyboy 2009-09-23
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 kaizi_sun 的回复:]
?是代表惰性吧? 我上面的似乎是表示(([a-z]+)(\d+)) 整个出现0次或1次  应该是这样
/([a-z]+?)(\d+?)/i 请帮我纠正下。谢谢
[/Quote]
? 有两种含义
第一表示重复描述字符,即其前的组合重复零或一次
第二当其前的字符为重复描述字符,则表示惰性,尽可能少的匹配

因为正则引擎默认的是贪婪的 象?虽然是匹配零或一次,但是它会尽可能多的匹配
而如果是 ?? 来用呢就是第二种情况
kaizi_sun 2009-09-23
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 mbh0210 的回复:]
引用 28 楼 kaizi_sun 的回复:
?是代表惰性吧? 我上面的似乎是表示(([a-z]+)(\d+)) 整个出现0次或1次  应该是这样
/([a-z]+?)(\d+?)/i 请帮我纠正下。谢谢

你这是js的吧,+标识匹配一次或者多次,?标识匹配前面的子表达式零次或一次。
?是惰性匹配
[/Quote]
是啊,学的是js的,应该一样的吧。:) 在这里?在前是表示惰性咯表示整个惰性([a-z]+)(\d+)这整个惰性,对不:)谢谢你啊。
BATTLERxANGE 2009-09-23
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
namespace WindowsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
X(7);
}
private void X(int a)
{
string str = "if(d3+(j9+m88)/8+43+2+Round(hh99+jj9))";
MatchCollection matches = Regex.Matches(str, @"[a-z]+\d+");
foreach (Match match in matches)
{
Match matchSZ = Regex.Match(match.Value, @"\d+");
Match matchYW = Regex.Match(match.Value, "[a-z]+");
str = str.Replace(match.Value,matchYW.Value+ Convert.ToString(int.Parse(matchSZ.Value) + a));
}
Console.WriteLine(str);
}
}
}
十八道胡同 2009-09-23
  • 打赏
  • 举报
回复
Regex reg = new Regex(@"(?i)\b[a-z]+\d+\b");

这个是对的。符合楼主的要求
十八道胡同 2009-09-23
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string str = "if(d3+(j9+m88)/8+43+2+Round(hh99+jj9))";
Regex reg = new Regex(@"(?i)\b([a-z]+)(\d+)\b");
MatchCollection mc = reg.Matches(str);
foreach (Match m in mc)
{
string istr = Regex.Replace(m.Value, "(?i)[a-z]+", "");
string sstr = Regex.Replace(m.Value, @"\d+", "");
str = str.Replace(m.Value, sstr + (Convert.ToInt32(istr) + 7).ToString());
}

Console.WriteLine(str);
}
}
}

if(d10+(j16+m95)/8+43+2+Round(hh106+jj16))
Press any key to continue . . .
随风落梦 2009-09-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 xzq686 的回复:]
试试看..不知道碰到特例行不..
C# codestring str="if(d3+(j9+m88)/8+43+2+Round(hh99+jj9))";
Regex reg=new Regex(@"(?i)([a-z]+)(\d+)");
MatchCollection mc= reg.Matches(str);foreach (Match min mc)
{string istr= Regex.Replace(m.Value,"(?i)[a-z]+","");string sstr= Regex.Replace(m.Value,@"\d+","");
str= str.Replace(m.Value, sstr+ (Convert.ToInt32(istr)+7).ToString());
}

[/Quote]
顶,不错
24K純帥 2009-09-23
  • 打赏
  • 举报
回复
这个用正则比较好。。
wackyboy 2009-09-23
  • 打赏
  • 举报
回复
用这个
放着人家写好的方法还不用
[Quote=引用 16 楼 qldsrx 的回复:]
最佳答案:
C# codepublic Form1()
{
InitializeComponent();
String a="if(d3+(j9+m88)/8+43+2+Round(hh99+jj9))";
MessageBox.Show(Regex.Replace(a,@"(?<=[a-zA-Z])(\d+)",new MatchEvaluator(CapText)));
}privatestring CapText(Match m)
{return (int.Parse(m.Value)+7).ToString();

}
[/Quote]
qldsrx 2009-09-23
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 heavilyarmed 的回复:]
牛人好多啊
[/Quote]

本来问题就不难,方法自然就多了,我甚至可以用最土的方法实现,也就是当没有提供正则的情况下。
不用正则表达式一样可以做到,而且速度说不定可以更快,至少肯定比那些用正则匹配后循环替换的快。


String a = "if(d3+(j9+m88)/8+43+2+Round(hh99+jj9))";
bool match = false;
StringBuilder tmp = new StringBuilder();
StringBuilder result = new StringBuilder();
foreach (char c in a)
{
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
{
match = true;
}
if (c >= '0' && c <= '9')
{
if (match)
{
tmp.Append(c);
}
else
{
result.Append(c);

}
}
else if (tmp.Length == 0)
{
result.Append(c);
}
else
{
match = false;
result.Append(int.Parse(tmp.ToString()) + 7);
tmp.Remove(0, tmp.Length);
result.Append(c);
}
}
MessageBox.Show(result.ToString());
boywangliang 2009-09-23
  • 打赏
  • 举报
回复
up
qmialo88 2009-09-23
  • 打赏
  • 举报
回复
用正则取
mbh0210 2009-09-23
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 kaizi_sun 的回复:]
?是代表惰性吧? 我上面的似乎是表示(([a-z]+)(\d+)) 整个出现0次或1次  应该是这样
/([a-z]+?)(\d+?)/i 请帮我纠正下。谢谢
[/Quote]
你这是js的吧,+标识匹配一次或者多次,?标识匹配前面的子表达式零次或一次。
?是惰性匹配
RyanDream 2009-09-23
  • 打赏
  • 举报
回复
友情UP
BitCoffee 2009-09-23
  • 打赏
  • 举报
回复

string srcString = "if(d3+(j9+m88)/8+43+2+Round(hh99+jj9))";
Regex r = new Regex("[a-zA-Z]+[0-9]+", RegexOptions.IgnoreCase | RegexOptions.Compiled);
MatchCollection matches = r.Matches(srcString);

for (int i = 0; i < matches.Count; i++)
{
//string str1 = matches[i].ToString();//取得以字母开始数字结尾的字符,如d3,j9,m88,hh99,jj9
//string str2 = Regex.Replace(matches[i].ToString(), @"[a-zA-Z]+", "");//将str1字符中的字母抹去

int newnum = int.Parse(Regex.Replace(matches[i].ToString(), @"[a-zA-Z]+", "")) + 7;//将str1字符中的数字加7
string str3 = Regex.Replace(matches[i].ToString(), @"[0-9]+", newnum.ToString());//新得到的数字替换str1中的数字

srcString = srcString.Replace(matches[i].ToString(), str3);
}
kaizi_sun 2009-09-23
  • 打赏
  • 举报
回复
?是代表惰性吧? 我上面的似乎是表示(([a-z]+)(\d+)) 整个出现0次或1次 应该是这样
/([a-z]+?)(\d+?)/i 请帮我纠正下。谢谢
kaizi_sun 2009-09-23
  • 打赏
  • 举报
回复
正则菜鸟问楼上 (@"(?i)([a-z]+)(\d+)");
是不是等价于 /(([a-z]+)(\d+))?/i;
heavilyarmed 2009-09-23
  • 打赏
  • 举报
回复
牛人好多啊
加载更多回复(37)

110,579

社区成员

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

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

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