【问题标题】:Regex: spliting first, last name into comma-separated list eg "john smith Jr." to "john", "smith", "Jr."正则表达式:将名字、姓氏拆分为逗号分隔的列表,例如“john smith Jr.”。到“约翰”、“史密斯”、“小”
【发布时间】:2013-08-15 16:29:17
【问题描述】:

我正在使用 C# (asp .net),并且我有一个文本框,它接受对数据库执行查询的名称条目。

我想使用 IN 子句来获取所有可能的值,但在我的 c# 页面中我得到 1 个字符串

例如 'john smith' 所以我使用正则表达式将其分解为 'john','smith'

string text1 = "'"+Regex.Replace(text,@"[^A-Za-z0-9\-\.\']+","','")+"'";

但是对于像“John smith Jr.”这样的名字或'Bruce O'Brien',它失败了(由于特殊字符)

我的正则表达式中缺少什么?

谢谢

【问题讨论】:

标签: c# regex


【解决方案1】:

Regex 并不是最简单的方法。相反,我推荐String.Split method,它通过定义单词之间的空白字符来工作:

string fullname = "Bruce O'Brien";
string[] names;
Char[] separators = new Char [] {' '}; // only the space character, in this case

names = fullname.Split(separators);

一旦你有了一个名字数组,如果你需要的话,很容易把它变成一个 csv 字符串。

【讨论】:

  • 我想这是我需要的,谢谢您的快速回复
【解决方案2】:

根据其他人的建议,String.Split() 在这里可能更有意义。

但是,我认为您将面临一场艰苦的战斗。我这样做是为了将现有数据库中的名字和姓氏分开,我发现人们输入名字的方式有很多不同。考虑中间名、前缀、后缀等。

我已经发布了我最终在文章Splitting a Name into First and Last Names中使用的代码。

您可能需要考虑使用类似的方法。

【讨论】:

    【解决方案3】:

    在尝试解决此问题后,我发现了一个有效的正则表达式。它可能对其他人有用

    private Regex regex = new Regex("[^A-Za-z0-9\x27\x2D\x2E,\\s]");
    

    在哪里

    • A-Za-z 均值 alpha
    • 0-9 数字
    • \x27 APOSTROPHE(附注:如果这将在 DB 中运行的查询中添加第二个 ' 转义)
    • \x2D 连字符或减号
    • \x2E 句号或句号

    这里是完整选项列表:http://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=string-literal&unicodeinhtml=hex

    然后要制作列表,首先我检查regex.IsMatch(searchterm),制作:

    text = " ' " + Regex.Replace(text," ","','") + " ' "; 
    

    这导致 John Smith Jr. 给出 'John','Smith','Jr.';或 Kevin O'Neil'Kevin', 'O'Neil'

    感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-09
      相关资源
      最近更新 更多