从字符串中删除页码

时间:2014-04-17 13:50:25

标签: c# regex

所以我从各种书籍中获得了索引文件,我的目标是从这些文件中提取关键字。以下是我观察到的测试用例。

1,3-dichlorobenzene  3, 6
2,3,4,6-tetrachlorophenol  13
3-D Analyst  178
Alabama 1
ArcView  82, 161-170, 173-174, 178-179, 181, 185
    3-D Analyst  178
    Spatial Analyst  178, 185
NH3  48, 56                     see also ammonia
aluminum sulfate, Al2(SO4)3   159
calibration  32,  50-51, 58, 78, 84-86, 88, 103,  116, 118123, 139,   141, 144-155,  208, 221-222, 226-227,  233,  236,  243, 257,  259-261, 
channel  1-3, 99, 100, 102-103, 106, 120, 144, 208-209, 220, 222, 228, 236-         239, 246, 275, 295, 18, 320-328, 331, 337, 341

对我来说,保留关键字前面的空格非常重要,因为我正在使用它来确定层次结构。

删除页码后,这就是我需要的

1,3-dichlorobenzene  
2,3,4,6-tetrachlorophenol  
3-D Analyst  
Alabama 
ArcView  
    3-D Analyst  
    Spatial Analyst  
NH3                             see also ammonia
aluminum sulfate, Al2(SO4)3      
calibration  
channel  

目前我正在使用两组正则表达式。

  1. var numbers_numbers = new Regex(@"(\s+\d{1,9}\-+\s*\d{1,9},?)");
  2. var numbers = new Regex(@"(\s+\d{1,9},?)");
  3.  1. Step 1 will remove all the numbers of the format number-number, (example 173-174,) and  
     2. Step 2 will remove all the numbers of the format number,number (example 178, 185)
    

    然而,我的第二个正则表达式确实搞乱了我的数据,这是我在更换后获得的。

    1,3-dichlorobenzene  
    2,3,4,6-tetrachlorophenol  
    3-D Analyst  
    Alabama 
    ArcView  
        **-D Analyst**  
        Spatial Analyst  
    NH3                             see also ammonia
    aluminum sulfate, Al2(SO4)3
    calibration  
    channel
    

    请注意,3-D Analyst缺少3个。我也试过下面的正则表达式

    numbers = new Regex(@"(\s+\d{1,9}(?![^a-z\-]+),?)", RegexOptions.IgnoreCase);
    

    这无法从第一个测试案例中删除数字并返回“1,3-二氯苯3”

    numbers = new Regex(@"(\s+\d{1,9}[^a-z\-]+,?)", RegexOptions.IgnoreCase);
    

    这失败了“Alabama 1”测试用例,并返回“Alabama 1”。

    我想我已接近解决这个问题,但我不确定我错过了什么。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

如果您单独处理每一行,则以下正则表达式将执行:

(?<!^[\d\s,]*)(?<!\w|\))\d+\s*(-\s*\d+)?,?

Regular expression visualization

string output = Regex.Replace(input, @"(?<!^[\d\s,]*)(?<!\w|\))\d+\s*(-\s*\d+)?,?", string.Empty);

答案 1 :(得分:1)

您可能会或可能不会喜欢我解决此问题的方法;但似乎您的页码始终以双倍空格开头。因此,要删除页码,只需逐行爆炸,然后按双倍空间爆炸,然后像这样取出数组的第一个元素:

这是我为你写的一些快速而又脏的代码:

$str = '1,3-dichlorobenzene  3, 6
2,3,4,6-tetrachlorophenol  13
3-D Analyst  178
Alabama 1
ArcView  82, 161-170, 173-174, 178-179, 181, 185
    3-D Analyst  178
    Spatial Analyst  178, 185
NH3  48, 56                     see also ammonia
aluminum sulfate, Al2(SO4)3   159
calibration  32,  50-51, 58, 78, 84-86, 88, 103,  116, 118123, 139,   141, 144-155,  208, 221-222, 226-227,  233,  236,  243, 257,  259-261, 
channel  1-3, 99, 100, 102-103, 106, 120, 144, 208-209, 220, 222, 228, 236-         239, 246, 275, 295, 18, 320-328, 331, 337, 341';

$str = str_replace('    ', '', $str);

$arr = explode("\r\n", $str);
//print_r($arr);
$final = array();

// phase 1

foreach ($arr as $item)
{
    $_arr = explode('  ', $item);
    $final[] = $_arr[0];
}

echo '<pre>';
print_r($final);
$final2 = array();

// phase 2
foreach ($final as $item)
{
    $final2[] = preg_replace('/[0-9](?![A-Z])\,*\-?/', '', $item);
}

//print_r($final2);

输出是这样的:

Array
(
    [0] => 1,3-dichlorobenzene
    [1] => 2,3,4,6-tetrachlorophenol
    [2] => 3-D Analyst
    [3] => Alabama 1
    [4] => ArcView
    [5] => 3-D Analyst
    [6] => Spatial Analyst
    [7] => NH3
    [8] => aluminum sulfate, Al2(SO4)3
    [9] => calibration
    [10] => channel
)

您会看到所有数字,破折号和逗号都被删除,只留下标题:

答案 2 :(得分:0)

如果我理解你的问题,那就应该这样做

numbers = new Regex(@"(\s+\d{1,9},{1,9}[^a-z\-]+,?)", RegexOptions.IgnoreCase);