2 回答
TA貢獻1799條經驗 獲得超8個贊
此正則表達式模式將匹配字符串中的所有單個數字:
(".*?")|(\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
TA貢獻1752條經驗 獲得超4個贊
使用跟蹤狀態的解析器類型的解決方案來解決這個問題會更簡單。正則表達式適用于常規文本,只要您有上下文,就很難用正則表達式解決。像這樣的東西會起作用。
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();
}
}
- 2 回答
- 0 關注
- 174 瀏覽
添加回答
舉報
