Master_Shake 发表于 2015-4-13 12:42:35

需要帮助解析字符串吗

我正在处理一堆数据,其中一个字段是这样的格式:
ABCxxXxxABCjklMZ
或者基本上,前三个字符总是字符串,然后接下来的一个、两个或可能三个字符将是从0到9的整数,然后是大写的X,后跟一个、两个或三个从0到9的整数。在字符串的这一点上,我想丢弃最后一个整数左边的所有内容,获取它右边的所有内容。我很确定我可以用一些代码做到这一点,但这看起来可能是正则表达式的好时机。不太熟悉他们,我希望在这里得到一些建议。
有时用户可能会将大写字母X放入前三个字符中的一个,因此如果我在整数集之间键入大写字母X,我必须考虑到这一点。但大多数情况下,大写X只会出现在整数集之间,每个整数集可能包含1到3个数字。并且一组不会总是与另一组长度相同。
**** Hidden Message *****

CADbloke 发表于 2015-4-13 13:00:23


/\D+$/ig

潜在的?
应该匹配
ABC 11 x 11ABCjklMZ

Master_Shake 发表于 2015-4-13 17:53:50

如果我正确阅读并且不想使用regex那么可以链接一些字符串函数,这是一个简单的控制台程序,它有一个单行程序和一个逐步由函数单行程序String.Concat(input.Substring(input.IndexOf('X',3)+1)。跳过(Char.IsNumber));。
带有分步函数的单行函数。
类程序。
{。
静态无效主(字符串[]参数)。
{。
string[]输入=new[]{"XxC12X6ABCjkMZ","ABC12X21ABCjkMZ","XXX1X21ABCjkMZ"};。


Foreach(输入中的var输入)。
{。
Console.WriteLine(ParseField(输入));。
}。


Foreach(输入中的var输入)。
{。
ParseFieldbyBox(输入);。
}。
Console.ReadKey();。


}。


静态字符串ParseField(字符串输入)。
{。
返回String.Concat(input.Substring(input.IndexOf('X',3)+1)。
}。



静态空格ParseFieldbystep(字符串输入)。
{。
Console.WriteLine();。
Console.WriteLine(输入);。
var RemoveFirst3chars=input.Substring(3);。
Console.WriteLine(RemoveFirst3chars + " - 删除前3个字符");。


var indexOfFirstX=removeFirst3chars.IndexOf('X');。
Console.WriteLine(indexOfFirstX + " = 的第一个X在 \"" + 的索引First3chars +"\"");。


var indexAfterFirstX=indexOfFirstX+1;。
var stringAfterFirstX=removeFirst3chars.Substring(indexAfterFirstX);。
Console.WriteLine(stringAfterFirstX + " - X"后的字符串);。

int numberIndex=0;。
同时(Char.IsNumber(stringAfterFirstX)。
{。
Console.WriteLine(stringAfterFirstX + " - 是一个数字");。
numberIndex++;。
}。


Console.WriteLine(stringAfterFirstX + " - first non-number");。


var结果=stringAfterFirstX.Substring(numberIndex);。
Console.WriteLine("结果 = " + 结果);。
}。


}。

CADbloke 发表于 2015-4-13 22:13:25

字符串结果字符串=null;。
尝试{。
puttString=Regex.Replace(subjectString, @"(?:.*)(\d)(?!.*\d)(.*)", "$12美元",RegexOptions.IgnoreCase|RegexOptions.Multiline);。
}捕捉(参数异常ex){。
//正则表达式中的语法错误。
}你想抓取最后一个整数吗?如果是,请保留替换中的1美元,否则您的替换是2美元。请参阅屏幕截图以获取解释,这是http://www.regexbuddy.com/的,并且物有所值。另请参阅http://www.regexbuddy.com/regexmagic.html编辑:yay regex,当然我在第一次尝试时就弄错了。此外,在AutoCAD中添加了一个测试(不,您以前没有见过那个插件)moar编辑:这可能是一个更清晰的解释(RegexBuddy生成了这个)...@"。
(?: # 匹配下面的正则表达式。
,#匹配任何不是换行符的单个字符(换行符)。
*#在零和无限次之间,尽可能多的次数,根据需要回馈(贪婪)。
)。
(#匹配下面的正则表达式并将其匹配捕获到反向引用编号1中。
\d#匹配一个数字的单个字符(任何Unicode脚本中的任何十进制数)。
)。
(?! # 断言从这个位置开始不可能匹配下面的正则表达式(负前瞻)。
,#匹配任何不是换行符的单个字符(换行符)。
*#在零和无限次之间,尽可能多的次数,根据需要回馈(贪婪)。
\d#匹配一个数字的单个字符(任何Unicode脚本中的任何十进制数)。
)。
(#匹配下面的正则表达式并将其匹配捕获到反向引用编号2。
,#匹配任何不是换行符的单个字符(换行符)。
*#在零和无限次之间,尽可能多的次数,根据需要回馈(贪婪)。
)。
"。

Tuoni 发表于 2015-4-17 07:49:17

谢了。你们太棒了。这周我读了很多关于正则表达式的东西,这真的很酷。

CADbloke 发表于 2015-4-17 07:57:24

我只是不懂正则表达式,但这个网站http://www.regexr.com/这在很大程度上帮助我弄清楚了每个人

BlackBox 发表于 2015-4-19 08:48:50

仅供参考,不同的正则表达式引擎之间存在差异,即使用Javascript解析器,.NET引擎在一些地方略有不同。http://www.regular-expressions.info/ 是编写RegexBuddy的人的一个很棒的网站。http://stackoverflow.com/questions/22937618/reference-what-does-this-regex-mean/22944075#22944075 拥有的信息比您可能阅读的要多。

CADbloke 发表于 2015-4-28 06:12:20


heheh,更多信息...http://blog.codinghorror.com/regular-expressions-now-you-have-two-problems/
BTW,它远不止2-http://blog.codinghorror.com/regex-performance/和http://www.regular-expressions.info/catastrophic.html
TLDR;一个糟糕的正则表达式需要天来计算是完全可行的。因此。
。NET 4.5有一个超时属性。不要让它吓到你,我发现它们很快,我仍然有我所有的手指。

CADbloke 发表于 2015-6-26 12:29:11

免责声明:这是我能找到的最新相关帖子
只是想分享这个网站,它在几秒钟内就产生了一个可用的正则表达式“match”方法-强烈推荐

http://txt2re.com/index-csharp.php3
页: [1]
查看完整版本: 需要帮助解析字符串吗