2009-09-19 87 views
1

我想String.Split()使用逗號作爲delimitter以下字符串:如何拆分可能包含分隔符的用戶生成的字符串?

John,Smith,123 Main Street,212-555-1212 

以上內容是由用戶輸入的。如果他們在地址輸入一個逗號,得到的字符串會導致問題String.Split(),因爲你現在有5個區域,而不是4:

John,Smith,123 Main Street, Apt 101,212-555-1212 

我可以對所有用戶輸入使用與string.replace()更換別的東西逗號,然後再次使用與string.replace()東西轉換回逗號:

value = value.Replace(",", "*"); 

然而,這仍然可以愚弄如果用戶恰好使用佔位符delimitter有「*」他們的投入。那麼你最終會得到額外的逗號和結果中沒有星號。

我看到網上的解決方案來處理逃脫delimitters,但我還沒有發現這個看似常見的情況的解決方案。我錯過了什麼?

編輯:這就是所謂的delimitter collision

+3

你的問題與逃脫分隔符解決的問題有什麼不同?即爲什麼不逃避分隔符? – 2009-09-19 16:50:12

+2

你說你可以在所有的用戶輸入中替換逗號,這聽起來像是在這個時候值是分開的。他們爲什麼然後把它們串成一個串? – gix 2009-09-19 16:52:51

回答

2

一個萬無一失的解決方案將用戶輸入轉換爲base64,然後用逗號分隔。這意味着你必須在解析後轉換回來。

+0

非常好。非常感謝。這絕不會發生在我身上。 – royco 2009-09-24 18:34:08

3

這可能不是一個選擇,但會被它不會是更容易使用了非常少見的性格,說管道|,爲您的分隔符,不允許在一審中輸入這個人物?

+0

是的,這就是我的原始代碼所做的。它工作正常,但我正在尋找更通用的解決方案。 – royco 2009-09-24 18:36:03

+0

公平點鮑勃不確定您是否嘗試過原始問題的簡單解決方案。像base64的答案一樣。 – voiddog 2009-09-25 05:58:55

3

如果這是CSV,地址應該用引號括起來。解析文本時,CSV解析器廣泛應用於此。

John,Smith,"123 Main Street, Apt. 6",212-555-1212 
0

你可以嘗試把引號,或者一些其他的開始和結束的分隔符,圍繞每個用戶輸入,而忽略一組引號之間的任何特殊字符。

這真的歸結爲清理用戶輸入的情況。您只應在用戶輸入中允許所需的字符,並拒絕/剝離用戶的無效輸入。這樣你可以使用你的星號分隔符。

最好的解決辦法就是以某種方式定義無效字符,並且拒絕非有效字符,然後使用nonvalid字符(這將不會出現在輸入,因爲它們是「禁止」),你定界符

+0

爲什麼downvote?特別是當我開始提出什麼是當前最有回報的答案時,試圖揭示更好的解決方案? – 2009-09-19 19:24:32

-1

禮貌地提醒正確形成街道地址在美國和加拿大應該不會包含任何標點無論如何,也許你的用戶?

的受損的數據自動地轉換成有用的數據的方法,是不啓發式邏輯非平凡。您可以嘗試通過調用第三方地址格式庫來應用USPS格式規則來外包解析。

即使USPS也要求用戶通過在地址「canonicalizer」頁面(http://zip4.usps.com/zip4/welcome.jsp)上將地址的組成部分輸入到不同字段中來執行大部分工作。

+0

雖然我想支持美國和加拿大以外的地址。 – royco 2009-09-24 18:36:52

0

不允許用戶輸入您用作分隔符的那個字符。我個人覺得這是最好的方法。

0

滑稽的解決方案(工作,如果地址是昏迷的唯一字段):

分割字符串昏迷。前兩個部分將是姓名和姓氏;最後一部分是電話 - 把他們帶走。結合其餘的昏迷回 - 這將是地址;)

4

這是一個常見的情況 - 你有一些任意的字符串值,你想組成一個結構,它本身是一個字符串,但不允許的值干擾周圍結構的分隔符。

您有幾種選擇:

  1. 輸入限制:如果您的方案可以接受的,最簡單的辦法就是限制中的值使用的分隔符。在你的具體情況下,這意味着不允許使用逗號。
  2. 編碼:如果輸入限制不合適,下一個最簡單的選項就是編碼整個輸入值。選擇在其可能輸出範圍內沒有分隔符的編碼(例如,Base64在其編碼輸出中不包含逗號)
  3. 轉義分隔符:稍微複雜一點的選擇是爲轉義分隔符提供約定。如果您正在使用像CSV這樣的主流技術,則轉義問題很可能已經解決,並且您可以使用標準庫。如果不是的話,那麼需要考慮一個完整的轉義系統並實現它。

如果您可以靈活地不使用CSV來進行數據表示,則會打開大量其他選項。 (例如考慮這樣參數化SQL查詢迴避輸入通過從查詢字符串分開存儲的參數值逸出的複雜性的方式。)

0

在某種意義上,用戶已經「逃逸」的逗號與空間之後。

所以,試試這個:

string[] values = RegEx.Split(value, ",(?![ ])"); 

用戶仍然可以打破這一點,如果他們不把一個空間,還有一個更簡單的方法(使用引號包含逗號值的標準CSV方法),但是這會爲你提供的用例做訣竅。

一個更多的解決方案:提供一個「地址2」字段,這是公寓號碼傳統上會去的地方。如果用戶懶惰,用戶仍然可以分解它,但是他們實際上會在 address2之後破壞字段

相關問題