Я ищу совет по извлечению раздела строки, который всегда встречается как данные первого экземпляра между скобками с использованием perl и regex и назначает это значение переменной.Использование регулярного выражения для извлечения совпадающего шаблона из строки и назначения его переменной с использованием perl
Вот точная ситуация. Я использую perl и regex для извлечения идентификатора курса из университетского каталога и назначения его переменной. Пожалуйста, обратите внимание на следующее:
- BIO-2109-01 (12345) Введение в биологию
- CHM-3501-F2-01 (54321) Введение в химии
- IDS-3250-01 (98765) История США (1860-2000)
- SPN-1234-02-F1 (45678) История Испании (1900-2010)
типичный формат [сечение имя-курс] [(courseID)] [ название курса]
Моя цель - создать скрипт, который может принимать каждую запись по одному, назначать ее переменной, а затем использовать регулярное выражение для извлечения только идентификатора курса и назначения только идентификатора курса переменной.
Мой подход состоял в том, чтобы использовать поиск и замену, чтобы заменить все, что не соответствует этому с помощью '', а затем сохранить то, что осталось (идентификатор курса) для переменной. Вот несколько примеров того, что я пробовал следующее:
$string = "BIO-2109-01 (12345) Introduction to Biology";
($courseID = $string) =~ s/[^\d\d\d\d\d]//g;
print $courseID;
Результат: 21090112345 --- печатая сечение-название курса и courseID
$string = "BIO-2109-01 (12345) Introduction to Biology";
$($courseID = $string) =~ s/[^\b\(\d{5}\)]\b//g;
print $courseID;
Результат: 210901 (12345) - - печать сечения, название курса, скобки, и courseID
Так что я не очень везло с поиском и заменить - однако я нашел этот самородок:
\(([^\)]+)\)
http://regexr.com/, который будет соответствовать разделу parens. Однако он также будет соответствовать нескольким паранам, включая, например, (abc).
Я не совсем уверен, что в этот момент, как сделать что-то вроде этого:
$string = "BIO-2109-01 (12345) Introduction to Biology";
($courseID = $string) =~ [magicRegex_goes_here];
print courseID;
результат 12345
ИЛИ, лучше:
$string = IDS-3250-01 (98765) History of US (1860-2000)
($courseID = $string) =~ [magicRegex_goes_here];
print courseID;
результат 98765
Любые советы или направления были бы весьма признательны. Я пробовал все, что знаю, и могу исследовать в отношении регулярного выражения для решения этой проблемы. Если есть больше информации, которую я могу включить, пожалуйста, прошу прощения.
UPDATE
use warnings 'all';
use strict;
use feature 'say';
my $file = './data/enrollment.csv'; #File this script generates
my $course = ""; #Complete course string [name-of-course] [(courseID)] [course_name]
my @arrayCourses = ""; #Array of courseIDs
my $i = ""; #i in for loop
my $courseID = ""; #Extracted course ID
my $userName = ""; #Username of person we are enrolling
my $action = "add,"; #What we are doing to user
my $permission = "teacher,"; #What permissions to assign to user
my $stringToPrint = ""; #Concatinated string to write to file
my $n = "\n"; #\n
my $c = ","; #,
#BEGIN PROGRAM
print "Enter the username \n";
chomp($userName = <STDIN>); #Get the enrollee username from user
print "\n";
print "Enter course name and press enter. Enter 'x' to end. \n"; #prompt for course names
while ($course ne 'x') {
chomp($course = <STDIN>);
if ($course ne "x") {
if (($courseID) = ($course =~ /[^(]+\(([^)]+)\)/)) { #nasty regex to extract courseID - thnx PerlDuck and zdim
push @arrayCourses, $courseID; #put the courseID into array
}
else {
print "Cannot process last entry check it";
}
}
else {
last;
}
}
shift @arrayCourses; #Remove first entry from array - add,teacher,,username
open(my $fh,'>', $file); #open file
for $i (@arrayCourses) #write array to file
{
$stringToPrint= join "", $action, $permission, $i, $c, $userName, $n ;
print $fh $stringToPrint;
}
close $fh;
Это сделает это! Предложения и улучшения всегда приветствуются!Благодаря @PerlDuck и @zdim
+1 за ваши попытки! Обратите внимание, что '[...]' обозначает класс _character_, который в основном означает _one (произвольный) символ символов между '[' и ']' _. Поэтому '[ab \ dL]' соответствует _one of_ 'a',' b', цифре или 'L', а не все из них в строке. – PerlDuck
Напоминание в случае, если это провалилось сквозь трещины, см .: [Что делать, если кто-то отвечает на мой вопрос?] (Http://stackoverflow.com/help/someone-answers) – zdim