如何检查字符串是否包含给定字符列表之外的字符

时间:2018-12-18 19:57:29

标签: c# .net regex

我有一个字符串,我需要检查此字符串是否包含不在给定列表中的任何字符。

假设我有这个允许的字符new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' , '.'}

如果字符串为“ 54323.5”,就可以了!

如果字符串是“ 543g23.5”-这将是不可能的,因为它包含的“ g”不在我允许的字符列表中。

一个空字符串被认为是无效的。

我正在尝试通过使用“ IndexOfAny()”来实现这一目标,但是到目前为止还没有运气。当然,将所有不允许的字符传递给此方法将不是解决方案。

请注意,允许的字符列表可能会更改,并且基于列表更改来更改验证算法不被视为解决方案。

对于那些问我尝试过的代码的人,这里是:

        private bool CheckInvalidInput(string stringToCheck)
    {
        char[] allowedChars = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

        var chars = Enumerable.Range(0, char.MaxValue + 1)
                  .Select(i => (char)i)
                  .ToArray();

        var unallowedChars = chars.Except(allowedChars).ToArray();

        bool validString = true;
        if(stringToCheck.IndexOfAny(unallowedChars) != -1)
        {
            validString = false;
        }

        return validString;
    }

希望您会提供更好的解决方案:D。

3 个答案:

答案 0 :(得分:3)

这可以使用非常简单的模式来完成。 Regex.IsMatch(yourString, @"^[\d.]+$");

^是该行的开头

[\d.]+匹配一个或多个字符(.0-9

$是该行的结尾

Demo

编辑:这也将匹配.

如果不希望出现这种情况,请尝试使用此^(?=\d)[\d.]+$

答案 1 :(得分:3)

这很容易实现。 string类型实现了IEnumerable<char>,因此您可以使用LINQ All方法来检查其所有字符是否都满足谓词。对于您而言,谓词是allowedChars集中包含每个字符,因此您可以使用Contains方法:

private static bool CheckInvalidInput(string stringToCheck, IEnumerable<char> allowedChars)
{
    return stringToCheck.All(allowedChars.Contains);
}

如果您的allowedChars设置变大,您可能希望将其转换为HashSet<char>,以获得更好的性能。

完整示例:

using System;
using System.Linq;
using System.Collections.Generic;

public class Test
{
    public static void Main()
    {
        // var allowedChars = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.' };
        var allowedChars = "0123456789.";

        Console.WriteLine(CheckInvalidInput("54323.5", allowedChars));   // True
        Console.WriteLine(CheckInvalidInput("543g23.5", allowedChars));  // False
    }

    private static bool CheckInvalidInput(string stringToCheck, IEnumerable<char> allowedChars)
    {
        return stringToCheck.All(allowedChars.Contains);
    }
}

答案 2 :(得分:1)

如果允许的字符数组是动态的,则可以创建将接受允许的字符数组的过程并动态构建模式。请注意,您必须转义某些字符才能在Regex中使用:

#import <Mapbox/Mapbox.h>
#import <MapboxCoreNavigation/MapboxCoreNavigation.h>
#import <MapboxNavigation/MapboxNavigation.h>

- (void)viewDidLoad {   
    _menu.hidden = YES;

    MGLMapView *mapView = [[MGLMapView alloc] initWithFrame:_mapViewContainer.bounds];
    [mapView setAutoresizingMask: (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
    [_mapViewContainer addSubview:mapView];

}