2012-02-09 106 views
1

一個快速的手將不勝感激。 我想做一個小的算法,將文本從文本框輸入到正則表達式中。如下:String.Format用於創建正則表達式

string bar = String.Format(@"^{0}*(q*x|x*q)*", foo.Text); 

正則表達式類傳遞上面的bar變量並在事件觸發時初始化。但是,只有在重複文字時纔會返回匹配。文本框中的E.G bb返回所有以b開頭的結果,1b返回每個單詞的匹配結果。

???我的正則表達式或我的邏輯有什麼問題嗎? (或同時!!)

編輯我試圖匹配從文本文件加載的字符串列表。所有含有q和x至少一次的單詞,以文本框中的字母開頭。例子: arquifoux benzofuroquinoxaline benzoquinoxaline disquixote equiaxe

+0

你想達到什麼目的?請閱讀http://tinyurl.com/so-hints – 2012-02-09 23:15:05

+0

請提供您與此正則表達式匹配的字符串。 – 2012-02-09 23:15:38

回答

0

我想你想

string bar = String.Format(@"^{0}.*?(q.*?x|x.*?q).*", foo.Text); 

.匹配任何字符。 .*?中的問號只是讓匹配非貪婪(即'q'將匹配找到的第一個q),但在您的情況下它們並不是真的必要。

您以前的'q *'匹配「0個或更多q個字符」。

你可以進一步提高你的正則表達式:

string bar = String.Format(@"^{0}[a-z]*?(q[a-z]*?x|x[a-z]*?q)[a-z]*", foo.Text); 

其中僅匹配小寫字母。 (你可以輸入不區分大小寫的標誌給你的正則表達式來匹配任何情況)。

+0

* palmface *是的,正則表達式失敗。感謝您糾正我的愚蠢! – Suburbanpsyco6 2012-02-09 23:59:27

0

我敢肯定你的正則表達式是不正確。 我認爲你缺少一些時間在那裏*的前

如果你打破你有什麼():^{0}*(q*x|x*q)*即說:

^{0}* <-- starts with 0 or more of whatever the text box had. 
(q*x|x*q)* <-- then contains 0 or more of this pattern. 

因爲你所要求的「0或0更多「,它基本上匹配任何東西。輸入「BB」會奏效,因爲這將使起始正則表達式:^bb*其分解爲:

^b <-- starts with 1 letter 'b' 
b* <-- followed by 0 or more letter 'b's 

我想你想要的是:

^{0}.*(q.*x|x.*q)+ 

哪個下來休息到:

^{0} <-- starts with 1 of whatever my text box had 
.* <-- then 0 or more of anything 
(q.*x|x.*q)+ <-- then 1 or more of q + anything + x, or x + anything + q 
0

您錯過了正則表達式中匹配a,q和x之間字符的一些匹配項。對於字匹配,你會想這(\ W,而不是爲了限制,隻字字符)

^{0}\w*(q\w*x|x\w*q) 

也許這裏不需要你這裏,但它是很好的使用正則表達式。直接將其插入到一個正則表達式語句

0
string bar = string.Format("^(\w+\s+)*{0}\w+(q\w*x|x\w*q)+.*", Regex.Escape(Regfoo.Text)); 

這之前應該逃脫逃脫你的用戶輸入的文本:

  1. 匹配的行開始。^
  2. 匹配前面的任何或全部單詞。 (\ w + \ s +)*
  3. 匹配在單詞{0}開頭出現一次的指定文本。
  4. 匹配包含q的單詞的剩餘部分,然後x或x然後q。 \ w +(q \ w * x | x \ w * q)+
  5. 匹配其他字符。 。*