所以我从各种书籍中获得了索引文件,我的目标是从这些文件中提取关键字。以下是我观察到的测试用例。
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
目前我正在使用两组正则表达式。
var numbers_numbers = new Regex(@"(\s+\d{1,9}\-+\s*\d{1,9},?)");
var numbers = new Regex(@"(\s+\d{1,9},?)");
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”。
我想我已接近解决这个问题,但我不确定我错过了什么。任何帮助将不胜感激。
答案 0 :(得分:2)
如果您单独处理每一行,则以下正则表达式将执行:
(?<!^[\d\s,]*)(?<!\w|\))\d+\s*(-\s*\d+)?,?
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);