[英]Regex in PreviewTextInput: only decimals between 0.0 and 1.0
我想要一個正則表達式,它只允許在文本框中輸入介於0.0和1.0之間的數字。
但是它應該在方法PreviewTextInput中(C#,WPF項目)
所以普通的正則表達式不起作用
Regex regex = new Regex(@"^0|0.0|0\.[0-9]*|1\.0|1$");
我找到了一個正則表達式,它允許在PreviewTextInput方法中使用所有小數:
Regex regex = new Regex("^[.][0-9]+$|^[0-1.]*[.,]{0,1}[0-9]*$");
如何將此正則表達式更改為僅接受0-1之間的小數?
謝謝。
我的小數方法:
private void tb_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
Regex regex = new Regex("^[.][0-9]+$|^[0-1.]*[.,]{0,1}[0-9]*$");
e.Handled = !regex.IsMatch((sender as TextBox).Text.Insert((sender as TextBox).SelectionStart, e.Text));
}
我的0-1之間的十進制方法(無效):
private void tb_Surface_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
Regex regex = new Regex(@"^(0?\.[0-9]+|1\.0)$");
e.Handled = !regex.IsMatch(e.Text);
// e.Handled = !regex.IsMatch((sender as TextBox).Text.Insert((sender as TextBox).SelectionStart, e.Text));
}
您可以嘗試此正則表達式。
@"^(?:0?\.[0-9]+|1\.0)$"
關於@"^0|0.0|0\\.[0-9]*|1\\.0|1$"
:有兩個錯誤:
1)其中一個點不轉義,因此可以匹配任何字符。
2) ^
和$
僅分別出現在交替的第一個和最后一個分支中,但與每個分支都不相關。 為此,您必須將所有分支置於非捕獲組中。
關於"^[.][0-9]+$|^[0-1.]*[.,]{0,1}[0-9]*$"
:第一個分支正確,第二個分支正確假。
1) [0-1.]*
可寫入[01.]*
(有0和1之間沒有字符,沒有必要把的范圍)允許的任何組合0
, 1
和.
: 1111111111
, 10100010
或1.00.111..
。 不確定在此處允許點是個好主意。
2)可以寫成[.,]?
[.,]{0,1}
[.,]?
:為什么這次要允許逗號?
3) [.,]{0,1}[0-9]*$
如果點(或逗號)是可選的,則由於[0-9]*
,此子模式可以匹配任何整數。
我認為您必須考慮使用非捕獲組來構建您的模式。 從第一個模式開始似乎是最好的選擇。 無論如何,首要任務是明確定義允許的格式。
@"^(0(?:\.\d+)?|1(?:\.0+)?)$"
0
和1
也可以匹配,如果您不想匹配它們,並且點后必須有任何數字,則可以使用
@"^(0\.\d+|1\.0+)$"
下面的代碼是您想要的,當文本框失去焦點時,您需要刪除最后一個dot
,例如str.Trim('.')
private void tb_Surface_PreviewTextInput(object sender, TextCompositionEventArgs e)
{
var patten = @"^(0(\.\d*)?|1(\.0*)?)$";
Regex regex = new Regex(patten);
e.Handled = !regex.IsMatch(e.Text);
// e.Handled = !regex.IsMatch((sender as TextBox).Text.Insert((sender as TextBox).SelectionStart, e.Text));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.