我收到的字符串中包含与数字中的字符相同的数字,空值和定界符。此外,在包含逗号的数字周围也有引号。使用C#,我想解析字符串,这样我得到了一个很好的,用竖线分隔的数字系列,没有逗号,两位小数。
我尝试了标准替换,删除了某些字符串模式以进行清理,但我无法解决所有问题。我先删除了引号,但是随着千位分隔符变成定界符,我得到了更多的数字。我尝试将Regex.Replace
与通配符一起使用,但由于引号内有多个数字和引号内的逗号,因此无法使用通配符。
对于Silvermind的编辑:temp = Regex.Replace(temp,“(?:\” ,。* \“)”,“($ 1 = 。 \ n )“);
我无法控制收到的文件。我可以清理大部分数据。字符串如下所示时,才出现问题:
703.36,751.36,“ 1,788.36”,887.37,891.37,“ 1,850.37”,843.37,“ 1,549,797.36”,818.36,749.36,705.36,0.00,“ 18,979.70”,934.37
我应该寻找引号,找到下一个引号,从这两个字符之间的所有字符中删除逗号,然后继续吗?这是我要去的地方,但那里必须有一些优雅的东西(是的-我经常不使用C#编程-我是DBA)。
我希望删除千位分隔符,并且没有引号。
答案 0 :(得分:0)
此正则表达式模式将匹配您字符串中的所有单个数字:
(".*?")|(\d+(.\d+)?)
(".*?")
与"123.45"
(\d+(.\d+)?)
与123.45
或123
之类的东西匹配从那里,您可以进行简单的搜索并在每次比赛中进行替换,以获取一个“干净的”数字。
完整代码:
var s = "703.36,751.36,\"1,788.36\",887.37,891.37,\"1,850.37\",843.37,\"1,549,797.36\",818.36,749.36,705.36,0.00,\"18,979.70\",934.37";
Regex r = new Regex("(\".*?\")|(\\d+(.\\d+)?)");
List<double> results = new List<double>();
foreach (Match m in r.Matches(s))
{
string cleanNumber = m.Value.Replace("\"", "");
results.Add(double.Parse(cleanNumber));
}
Console.WriteLine(string.Join(", ", results));
输出:
703.36, 751.36, 1788.36, 887.37, 891.37, 1850.37, 843.37, 1549797.36, 818.36, 749.36, 705.36, 0, 18979.7, 934.37
答案 1 :(得分:0)
使用跟踪状态的解析器类型的解决方案更容易解决。正则表达式用于常规文本,只要您有上下文,就很难用正则表达式解决。这样的事情会起作用。
internal class Program
{
private static string testString = "703.36,751.36,\"1,788.36\",887.37,891.37,\"1,850.37\",843.37,\"1,549,797.36\",818.36,749.36,705.36,0.00,\"18,979.70\",934.37";
private static void Main(string[] args)
{
bool inQuote = false;
List<string> numbersStr = new List<string>();
int StartPos = 0;
StringBuilder SB = new StringBuilder();
for(int x = 0; x < testString.Length; x++)
{
if(testString[x] == '"')
{
inQuote = !inQuote;
continue;
}
if(testString[x] == ',' && !inQuote )
{
numbersStr.Add(SB.ToString());
SB.Clear();
continue;
}
if(char.IsDigit(testString[x]) || testString[x] == '.')
{
SB.Append(testString[x]);
}
}
if(SB.Length != 0)
{
numbersStr.Add(SB.ToString());
}
var nums = numbersStr.Select(x => double.Parse(x));
foreach(var num in nums)
{
Console.WriteLine(num);
}
Console.ReadLine();
}
}