如何在结尾处找到带标点符号的字符串

时间:2016-10-24 00:01:18

标签: c# regex string text punctuation

我试图理解,为什么当我检查我的文本文档内容(更新的内容,每次是新的字符串)时,新的插入类似已存在的字符串,例如,如果文档内容是:

hello world
hello, world
hello, world.
.hello, world

如果它已经存在于文件内容中,如果它是“ hello world ”或“ hello,world ”,它会创建新添加的字符串,具有简单的检查条件,如果字符串已经存在,则会通知我(并且字符串中的最后一个符号没有任何限制或其他条件):

 List<string> wordsTyped = new List<string>(); 

    if (wordsTyped.Contains(newStr))
    {
        string[] allLines = File.ReadAllLines(path);
    }

但是如果我的文档内容字符串在字符串的结尾或开头有标点符号,它就不会通知我。例如,如果“ hello,world。”已经存在,并且新插入类似“ hello,world。”或“,hello,world “它找不到它,并通知我不存在。

如果没有解决方法可以解决这个问题并且我被迫删除字符串中的最后一个特殊符号,在这种情况下也可以知道如何使用正则表达式来处理某些符号点,逗号,哈希,撇号和当然保留其他一切

1 个答案:

答案 0 :(得分:1)

您可能希望使用HashSet来存储您已拥有的字符串,因为访问速度更快。然后删除字符串中不需要的所有字符:

static String beautify(String ugly)
{
    return String.Join("", ugly.Where(c => Char.IsLetter(c)));
}

在这里,我冒昧地只检查角色是否是一个字母,当然,你可以根据自己的需要调整它。然后使用这个小程序:

static HashSet<String> lines = new HashSet<String>();
static List<String> input = new List<String>()
{
    "hello world","hello, world","hello, world.",".hello, world",
};

static void Main(String[] args)
{
    initList(input);
    var tests = new List<String>() {
        "h,e.l!l:o. w----orl.d.",// True
        "h,e.l!l:o. w----ol.d.",// False

    };

    foreach(var test in tests)
    {
        Console.WriteLine($"The string \"{test}\" is {(lines.Contains(beautify(test)) ? "already" : "not" )} here"); 
    }

    Console.ReadLine();
}

static void initList(List<String> input)
{
    foreach(String s in input)
        lines.Add(beautify(s));
}

static String beautify(String ugly)
{
    return String.Join("", ugly.Where(c => Char.IsLetter(c)));
}

将输出:

  

字符串“h,e.l!l:o.w ---- orl.d。”已经在这里了

     

字符串“h,e.l!l:o.w ---- ol.d。”不在这里

您可以像这样使用HashSet:

lines
Count = 4
    [0]: "hello world"
    [1]: "hello, world"
    [2]: "hello, world."
    [3]: ".hello, world"
lines.Contains("hello, world.")
true
lines.Contains("hello, world..")
false