我需要从字符串中提取和删除一个单词.字应该是大写,和之后的定界符之一/,;,(,-或的空间.
一些例子:
"this is test A/ABC"
预期产出:"this is test A"和"ABC"
"this is a test; ABC/XYZ"
预期产出:"this is a test; ABC"和 "XYZ"
"This TASK is assigned to ANIL/SHAM in our project"
预期产出:"This TASK is assigned to ANIL in our project"和 "SHAM"
"This TASK is assigned to ANIL/SHAM in OUR project"
预期产出:"This TASK is assigned to ANIL/SHAM in project"和 "OUR"
"this is test AWN.A"
预期产出:"this is test"和 "AWN.A"
"XETRA-DAX"
预期产出:"XETRA"和 "DAX"
"FTSE-100"
预期产出:"-100"和 "FTSE"
"ATHEX"
预期产出:""和 "ATHEX"
"Euro-Stoxx-50"
预期产出:"Euro-Stoxx-50"和 ""
我怎样才能做到这一点?
xan*_*tos 14
"智能"版本:
string strValue = "this is test A/ABC";
int ix = strValue.LastIndexOfAny(new[] { '/', ' ', ';', '(', '-' });
var str1 = strValue.Substring(0, ix);
var str2 = strValue.Substring(ix + 1);
Run Code Online (Sandbox Code Playgroud)
一个"愚蠢的LINQ"版本:
var str3 = new string(strValue.Reverse().SkipWhile(p => p != '/' && p != ' ' && p != ';' && p != '(' && p != '-').Skip(1).Reverse().ToArray());
var str4 = new string(strValue.Reverse().TakeWhile(p => p != '/' && p != ' ' && p != ';' && p != '(' && p != '-').Reverse().ToArray());
Run Code Online (Sandbox Code Playgroud)
两种情况都没有检查.OP可以添加支票,如果他想要的话.
对于第二个问题,使用LINQ真的太难了.使用正则表达式,它"很容易".
var regex = new Regex("^(.*[A-Z]+)([-/ ;(]+)([A-Z]+)(.*?)$");
var strValueWithout = regex.Replace(strValue, "$1$4");
var extractedPart = regex.Replace(strValue, "$3");
Run Code Online (Sandbox Code Playgroud)
对于第三个问题
var regex = new Regex("^(.*?)([A-Z.]*)([-/ ;(]+)([A-Z.]+)(.*?)$", RegexOptions.RightToLeft);
var strValueWithout = regex.Replace(strValue, "$1$2$5");
var extractedPart = regex.Replace(strValue, "$4");
Run Code Online (Sandbox Code Playgroud)
使用代码示例:http://ideone.com/5OSs0
另一个更新(它变成了BORING)
Regex Regex = new Regex(@"^(?<1>.*?)(?<2>[-/ ;(]*)(?<=\b)(?<3>[A-Z.]+)(?=\b)(?<4>.*?)$|^(?<1>.*)$", RegexOptions.RightToLeft);
Regex Regex2 = new Regex(@"^(?<1>.*?)(?<2>[-/ ;(]*)(?<=\b)(?<3>(?:\p{Lu}|\.)+)(?=\b)(?<4>.*?)$|^(?<1>.*)$", RegexOptions.RightToLeft);
var str1 = Regex.Replace(str, "$1$4");
var str2 = Regex.Replace(str, "$3");
Run Code Online (Sandbox Code Playgroud)
两者之间的区别在于,第一个将使用AZ作为大写字符,第二个将使用其他"大写"字符,例如 ÀÈÉÌÒÙ
使用代码示例:http://ideone.com/FqcmY
这应该根据新的要求工作:它应该找到用大写单词包装的最后一个分隔符:
Match lastSeparator = Regex.Match(strExample,
@"(?<=\b\p{Lu}+)[-/ ;(](\p{Lu}+)\b",
RegexOptions.RightToLeft); // last match
string main = lastSeparator.Result("$`$'"); // before and after the match
string word = lastSeparator.Groups[1].Value; // word after the separator
Run Code Online (Sandbox Code Playgroud)
这个正则表达式有点棘手.主要技巧:
RegexOptions.RightToLeft找到的最后一场比赛.$`$'作为替换字符串:http://www.regular-expressions.info/refreplace.html\p{Lu}对于大写字母,你可以改变它,[A-Z]如果你更舒服.如果单词不应该遵循大写单词,则可以将正则表达式简化为:
@"[-/ ;(](\p{Lu}+)\b"
Run Code Online (Sandbox Code Playgroud)如果您还想要其他角色,可以使用角色类(也可以删除\b).例如:
@"[-/ ;(]([\p{Lu}.,]+)"
Run Code Online (Sandbox Code Playgroud)工作示例:http://ideone.com/U9AdK
| 归档时间: |
|
| 查看次数: |
2303 次 |
| 最近记录: |