PowerShell regular expression on logfile is capturing too much - regex
I am trying to extract some text from a logfile, and I'm having problems.
Example text I am working on is:
ahksjhadjsadhsah
sakdsjakdjks
ksajdksaj
REF=35464
sadsad
213213
213
2
13
I need to extract the value "35464" (the REF number). I have limited knowledge of regular expressions, but thought 'REF=([0-9]+)' would do this.
Now I'm not sure how best I should be doing reading this file, so I've tried a couple of ways:
select-string -path e:\powershell\log.txt -pattern 'REF=([0-9]+)' | % { $_.Matches } | % { $_.Value }
Which gives me "REF=35464" - which I don't understand (why REF= is included), because I thought the 'capture' was only the parts in ()'s?
I also tried:
$data=Get-Content e:\powershell\log.txt
$data -match 'REF=([0-9]+)'
$Matches
But $Matches is empty.
I also tried a similar method to the above, but line by line, for example:
foreach ($line in $data)
{
$line -match 'REF=([0-9]+)'
}
I either get no matches or the full match (including the REF= part). I've also tried groups (that is, '(REF=)([0-9]+)'), and I can't get what I need.
How should I be reading the file? What is wrong with my regular expression?
I just need this extracted value as a usable variable.
It may be the way you are trying to access the capture group
I put this quick static class together to illustrate how to get the match you are looking for.
Note: I am using the # symbol on the regex and your input string to make them literals.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace SkunkWorks.RegexPractice
{
public static class RegexPractice2
{
public static string input = #"ahksjhadjsadhsah
sakdsjakdjks
ksajdksaj
REF=35464
sadsad
213213
213
2
13";
static string pat = #"REF=([0-9]+)";
public static void Do()
{
Regex r = new Regex(pat, RegexOptions.IgnoreCase);
Match m = r.Match(input);
int matchCount = 0;
while (m.Success)
{
Console.WriteLine("Match" + (++matchCount));
for (int i = 1; i <= 2; i++)
{
Group g = m.Groups[i];
Console.WriteLine("Group" + i + "='" + g + "'");
CaptureCollection cc = g.Captures;
for (int j = 0; j < cc.Count; j++)
{
Capture c = cc[j];
System.Console.WriteLine("Capture" + j + "='" + c + "', Position=" + c.Index);
}
}
m = m.NextMatch();
}
}
}
}
What I usually do when I need to extract a substring from an array of strings is to use the automatic variable $Matches that is generated from using the -match operator in a Where statement. Like this:
$Data | Where{$_ -match "REF=([0-9]+)"} | ForEach{$Matches[1]}
Now, the $Matches variable there will be an array. The first entry will be the entire line that it matched, and the second object will be just the captured text, that is why I specify [1]. Now, about your RegEx that you're matching on... technically it's acceptable, but it's not very specific, so it really could return just the first number since [0-9]+ means 1 or more character that falls within the [0-9] scope. If you want to be sure that you get all of the numbers you can tell it to get everything to the end of the line by using the end-of-line character $ in your match like: REF=([0-9]+)$. We can't really tell if there's any whitespace after the numbers, so you might want to allow for that too using the \s notation that looks for any whitespace character (spaces, tabs, whatever), and using the asterisks after it which means zero or more. Then it becomes REF=([0-9]+)\s*$, which gets you exactly what you were looking for. Lastly, I would use \d instead of [0-9] because it does the same thing and it's shorter and simpler, and specifically made for the job. So, we have:
$Data | Where{$_ -match "REF=(\d+)\s*$"} | ForEach{$Matches[1]}
And that is broken down step by step and explained here: https://regex101.com/r/dG7jC7/1
Related
Is it possible to combine two regex patterns into one without using OR | , pipe character
I am working on regex to match either(not both) of two conditions like this: Digits following A. ex) A123, regex (?<=A)\d+ Digits followed by Z. ex) 123Z, regex \d+(?=Z) So naive way is to use '|' to combine them like this: (?<=A)\d+|\d+(?=Z) This could be better for readability and maintainability, but I'm just curious if there is another way to make it without |. Here is a C# test code for that. string pattern = #"(?<=A)\d+|\d+(?=Z)"; var currencies = new string[]{ "A123", // match "123Z", // match "123", // NOT match }; foreach (var c in currencies) { Match m = Regex.Match(c, pattern, RegexOptions.IgnoreCase); Console.WriteLine("Matched:" + m.Success + ". Value:" + m.Value); } The output of the code here. Matched:True. Value:123 Matched:True. Value:123 Matched:False. Value:
Remove substrings between < and > (including the brackets) with no angle brackets inside
I have to modify a html-like text with the sed command. I have to delete substrings starting with one or more < chars, then having 0 or more occurrences of any characters but angle brackets and then any 1 or more > chars. For example: from aaa<bbb>ccc I would like to get aaaccc I am able to do this with "s/<[^>]\+>//g" but this command doesn't work if between <> characters is an empty string, or if there is double <<>> in the text. For example, from aa<>bb<cc>vv<<gg>>h I get aa<>bbvv>h instead of aabbvvh How can I modify it to give me the right result?
The problem is that once you allow nesting the < and > characters, you convert the language type from "regular" to "context free". Regular languages are those that are matched by regular expressions, while context free grammars cannot be parsed in general by a regular expression. The unbounded level of nesting is what impedes this, needing a pile based automaton to be able to parse such languages. But there's a little complicated workaround to this, if you consider that there's an upper limit to the level of nesting you will allow in the text you are facing, then you can convert into regular a language that is not, based on the premise that the non-regular cases will never occur: Let's suppose you will never have more than three levels of nesting into your pattern, (this allows you to see the pattern and be able to extend it to N levels) you can use the following algorithm to build a regular expression that will allow you to match three levels of nesting, but no more (you can make a regexp to parse N levels, but no more, this is the umbounded bounded nature of regexps :) ). Let's construct the expression recursively from the bottom up. With only one level of nesting, you have only < and > and you cannot find neither of these inside (if you allow < you allow more nesting levels, which is forbidden at level 0): {l0} = [^<>]* a string including no < and > characters. Your matching text will be of this class of strings, surrounded by a pair of < and > chars: {l1} = <[^<>]*> Now, you can build a second level of nesting by alternating {l0}{l1}{l0}{l1}...{l0} (this is, {l0}({l1}{l0})* and surrounding the whole thing with < and >, to build {l2} {l2} = <{l0}({l1}{l0})*> = <[^<>]*(<[^<>]*>[^<>]*)*> Now, you can build a third, by alternating sequences of {l0} and {l2} in a pair of brackets... (remember that {l-i} represents a regexp that allows upto i levels of nesting or less) {l3} = <{l0}({l2}{l0})*> = <[^<>]*(<[^<>]*(<[^<>]*>[^<>]*)*>[^<>]*)*> and so on, successively, you form a sequence of {lN} = <{l0}({l(N-1)}{l0})*> and stop when you consider there will not be a deeper nesting in your input file. So your level three regexp is: <[^<>]*(<[^<>]*(<[^<>]*>[^<>]*)*>[^<>]*)*> {l3--------------------------------------} <{l0--}({l2---------------------}{l0--})*> <{l0--}({l1----}{l0--})*> <{l0--}> You can see that the regexp grows as you consider more levels. The good things is that you can consider a maximum level of three or four and most text will fit in this cathegory. See demo. NOTE Never hesitate to build a regular expression, despite of it appearing somewhat complex. Think that you can build it inside your program, just using the techniques I've used to build it (e.g. for a 16 level nesting regexp, you'll get a large string, very difficult to write it by hand, but very easy to build with a computer) package com.stackoverflow.q61630608; import java.util.regex.Pattern; public class NestingRegex { public static String build_regexp( char left, char right, int level ) { return level == 0 ? "[^" + left + right + "]*" : level == 1 ? left + build_regexp( left, right, 0 ) + right : left + build_regexp( left, right, 0 ) + "(" + build_regexp( left, right, level - 1 ) + build_regexp( left, right, 0 ) + ")*" + right; } public static void main( String[] args ) { for ( int i = 0; i < 5; i++ ) System.out.println( "{l" + i + "} = " + build_regexp( '<', '>', i ) ); Pattern pat = Pattern.compile( build_regexp( '<', '>', 16 ), 0 ); String s = "aa<>bb<cc>vv<<gg>>h<iii<jjj>kkk<<lll>mmm>ooo>ppp"; System.out.println( String.format( "pat.matcher(\"%s\").replaceAll(\"#\") => %s", s, pat.matcher( s ).replaceAll( "#" ) ) ); } } which, on run gives: {l0} = [^<>]* {l1} = <[^<>]*> {l2} = <[^<>]*(<[^<>]*>[^<>]*)*> {l3} = <[^<>]*(<[^<>]*(<[^<>]*>[^<>]*)*>[^<>]*)*> {l4} = <[^<>]*(<[^<>]*(<[^<>]*(<[^<>]*>[^<>]*)*>[^<>]*)*>[^<>]*)*> pat.matcher("aa<>bb<cc>vv<<gg>>h<iii<jjj>kkk<<lll>mmm>ooo>ppp").replaceAll("#") => aa#bb#vv#h#ppp The main advantage of using regular expressions is that once you have written it, it compiles into an internal representation that only has to visit each character of the string being matched once, leading to a very efficient final matching code (probably you'll not get so efficient writing the code yourself) Sed for sed, you only need to generate an enough deep regexp, and use it to parse your text file: sed 's/<[^<>]*\(<[^<>]*\(<[^<>]*\(<[^<>]*\(<[^<>]*\(<[^<>]*>[^<>]*\)*>[^<>]*\)*>[^<>]*\)*>[^<>]*\)*>[^<>]*\)*>//g' file1.xml will give you appropiate results (this is 6 levels of nesting or less ---remember the ( and ) must be escaped to be considered group delimiters in sed) Your regexp can be constructed using shell variables with the following approach: l0="[^<>]*" l1="<${l0}>" l2="<${l0}\(${l1}${l0}\)*>" l3="<${l0}\(${l2}${l0}\)*>" l4="<${l0}\(${l3}${l0}\)*>" l5="<${l0}\(${l4}${l0}\)*>" l6="<${l0}\(${l5}${l0}\)*>" echo regexp is "${l6}" regexp is <[^<>]*\(<[^<>]*\(<[^<>]*\(<[^<>]*\(<[^<>]*\(<[^<>]*>[^<>]*\)*>[^<>]*\)*>[^<>]*\)*>[^<>]*\)*>[^<>]*\)*> sed -e "s/${l6}/#/g" <<EOF aa<>bb<cc>vv<<gg>>h<iii<jj<>j>k<k>k<<lll>mmm>ooo>ppp EOF aa#bb#vv#h#ppp (I've used # as substitution pattern, instead, so you can see where in the input string have the patterns been detected)
You may use sed 's/<\+[^>]*>\+//g' sed 's/<\{1,\}[^>]*>\{1,\}//g' sed -E 's/<+[^>]*>+//g' The patterns match <\+ / <\{1,\} - 1 or more occurrences of < char [^>]* - negated bracket expression that matches 0 or more chars other than > >\+ / >\{1,\} - 1 or more occurrences of > char Note that in the last, POSIX ERE, example, + that is unescaped is a quantifier matching 1 or more occurrences, same as \+ in the POSIX BRE pattern. See the online sed demo: s='aa<>bb<cc>vv<<gg>>h' sed 's/<\+[^>]*>\+//g' <<< "$s" sed 's/<\{1,\}[^>]*>\{1,\}//g' <<< "$s" sed -E 's/<+[^>]*>+//g' <<< "$s" Result of each sed command is aabbvvh.
Powershell - Regex date range replace
I have an input file which contains some start dates and if those dates are before a specific date 1995-01-01 (YYYY-MM-DD format) then replace the date with the minimum value e.g. <StartDate>1970-12-23</StartDate> would be changed to <StartDate>1995-01-01</StartDate> <StartDate>1996-05-12</StartDate> is ok and would remain unchanged. I was hoping to use regex replace but checking for the date range isn't working as expected. I was hoping to use something like this for the range check \b(?:1900-01-(?:3[01]|2[1-31])|1995/01/01)\b
You can use a simple regex like '<StartDate>(\d{4}-\d{2}-\d{2})</StartDate>' to match <StartDate>, 4 digits, -, 2 digits, -, 2 digits, and </StartDate>, and then use a callback method to parse the captured into group 1 date and use Martin's code there to compare dates. If the date is before the one defined, use the min date, else, use the one captured. $callback = { param($match) $current = [DateTime]$match.Groups[1].Value $minimum = [DateTime]'1995-01-01' if ($minimum -gt $current) { '<StartDate>1995-01-01</StartDate>' } else { '<StartDate>' + $match.Groups[1].Value + '</StartDate>' } } $text = '<StartDate>1970-12-23</StartDate>' $rex = [regex]'<StartDate>(\d{4}-\d{2}-\d{2})</StartDate>' $rex.Replace($text, $callback) To use it with Get-Content and Foreach-Object, you may define the $callback as above and use $rex = [regex]'<StartDate>(\d{4}-\d{2}-\d{2})</StartDate>' (Get-Content $path\$xml_in) | ForEach-Object {$rex.Replace($_, $callback)} | Set-Content $path\$outfile
You don't have to use regex here. Just cast the dates to DateTime and compare them: $currentDate = [DateTime]'1970-12-23' $minDate = [DateTime]'1995-01-01' if ($minDate -gt $currentDate) { $currentDate = $minDate }
replace a tag with regex
I'm trying to do my homework but regex is new for me and I'm not sure why my code doesn't work. That's what I have to do: Write a program that replaces in a HTML document given as string all the tags <a href=…>…</a> with corresponding tags [URL href=…]…[/URL]. Read an input, until you receive “end” command. Print the result on the console. I wrote: Pattern pattern = Pattern.compile("<a href=\"(.)+\">(.)+<\\/a>"); input = input.replaceAll(matcher.toString(), "href=" + matcher.group(1) + "]" + matcher.group(2) + "[/URL]"); And it throws Exception in thread "main" java.lang.IllegalStateException: No match found for this input: href="http://softuni.bg">SoftUni</a>
Your + quantifer needs to be inside the parentheses: <a href=\"(.+)\">(.+)<\\/a>
You were heading in the right direction, but you can't use a Pattern object like that. First, change you code to use replaceAll() just with strings directly and use normal back references $n in the replacement string. Your code thus converted is: input = input.replaceAll("<a href=(\".+\")>(.)+<\\/a>", "href=$1]$2[/URL]"); Next, fix the expressions: input = input.replaceAll("<a href=(\".+\")>(.+)</a>", "[URL href=$1]$2[/URL]"); The changes were to put the + inside the capturing group. ie (.)+ -> (.+) and also to capture the double quotes, since you have to put them back if I interpret the "spec" correctly. Also note that you don't need to escape a forward slash. Forward slashes are just plain old characters in all regex flavors. Although some languages use forward slashes to delimit regular expressions, java isn't one of them.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace _06.Replace_a_Tag { class Program { static void Main(string[] args) { string text = Console.ReadLine(); while (text != "end") { string pattern = #"<a.*?href.*?=(.*)>(.*?)<\/a>"; // is used to take only 2 groups : // first group (or group one) is used for the domain name // for example : "https://stackoverflow.com" // and the second is for if you want to enter some text // (or no text) // for example : This is some text string replace = #"[URL href=$1]$2[/URL]"; // we use $ char and a number (like placeholders) // for example : $1 means take whatever you find from group 1 // and : $2 means take whatever you find from group 2 string replaced = Regex.Replace(text, pattern , replace); // In a specific input string (text), replaces all strings // that match a specified regular expression (pattern ) with // a specified replacement string (replace) Console.WriteLine(replaced); text = Console.ReadLine(); } } } } // input : <ul><li></li></ul> // output: <ul><li>[URL href=""][/URL]</li></ul>
I want to replace ',' on the 150th location in a String with a <br>
My String is : PI Last Name equal to one of ('AARONSON','ABDEL MEGUID','ABDEL-LATIF','ABDOOL KARIM','ABELL','ABRAMS','ACKERMAN','ADAIR','ADAMS','ADAMS-CAMPBELL', 'ADASHI','ADEBAMOWO','ADHIKARI','ADIMORA','ADRIAN', 'ADZERIKHO','AGADJANYAN','AGARWAL','AGOT', 'AGUIRRE-CRUZ','AHMAD','AHMED','AIKEN', 'AINAMO', 'AISENBERG','AJAIYEOBA','AKA','AKHTAR','AKINGBEMI','AKINYINKA','AKKERMAN','AKSOY','AKYUREK', 'ALBEROLA-ILA','ALBERT','ALCANTARA' ,'ALCOCK','ALEMAN', 'ALEXANDER','ALEXANDRE','ALEXANDROV','ALEXANIAN','ALLAND','ALLEN','ALLISON','ALPER', 'ALTMAN','ALVAREZ','AMARYAN','AMBESI-IMPIOMBATO','AMEGBETO','AMOWITZ', 'ANAGNOSTARAS','ANAND','ANDERSEN','ANDERSON', 'ANDRADE','ANDREEFF','ANDROPHY','ANGER','ANHOLT','ANTHONY','ANTLE','ANTONELLI','ANTONY', 'ANZULOVICH', 'APODACA','APOSHIAN','APPEL','APPLEBY','APRIL','ARAUJO','ARBIB','ARBOLEDA', 'ARCHAKOV','ARCHER', 'ARECHAVALETA-VELASCO','ARENS','ARGON','ARGYROKASTRITIS', 'ARIAS','ARIZAGA','ARMSTRONG','ARNON', 'ARSHAVSKY','ARVIN','ASATRYAN','ASCOLI','ASKENASE','ASSI','ATALAY','ATANASOVA','ATKINSON','ATTYGALLE','ATWEH','AU','AVETISYAN','AWE','AYOUB','AZAD','BACSO','BAGASRA','BAKER','BALAS', 'BALCAZAR','BALK','BALKAY','BALLOU','BALRAJ','BALSTER','BANERJEE','BANKOLE','BANTA','BARAL','BARANOWSKA','BARBAS', 'BARBER','BARILLAS-MURY','BARKHOLT','BARNES','BARNETT','BARRETT','BARRIA','BARROW','BARROWS','BARTKE','BARTLETT','BASSINGTHWAIGHTE','BASSIOUNY','BASU','BATES','BATTAGLIA','BATTERMAN','BAUER','BAUERLE','BAUM','BAUME', 'BAUMLER','BAVISTER','BAWA','BAYNE','BEASLEY','BEATTY','BEATY','BEBENEK','BECK','BECKER','BECKMAN','BECKMAN-SUURKULA' ,'BEDFORD','BEDOLLA','BEEBE','BEEMON','BEHETS','BEHRMAN','BEIER','BEKKER','BELL','BELLIDO','BELMAIN', 'BENATAR','BENBENISHTY','BENBROOK','BENDER','BENEDETTI','BENNETT','BENNISH','BENZ','BERG','BERGER','BERGEY','BERGGREN','BERK','BERKOWITZ','BERLIN','BERLINER','BERMAN','BERTINO','BERTOZZI','BERTRAND','BERWICK','BETHONY','BEYERS','BEYRER' ,'BEZPROZVANNY','BHAGWAT','BHANDARI','BHARGAVA','BHARUCHA','BHUJWALLA','BIANCO','BIDLACK','BIELERT','BIER','BIESSMANN','BIGELOW' ,'BILLER','BILLINGS','BINDER','BINDMAN','BINUTU','BIRBECK','BIRGE','BIRNBAUM','BIRO','BIRT','BISHAI','BISHOP','BISSELL','BJORKEGREN','BJORNSTAD','BLACK','BLANCHARD','BLASS','BLATTNER','BLIGNAUT','BLOCH','BLOCK','BLOOM','BLOOM,','BLUM','BLUMBERG' ,'BLUMENTHAL','BLYUKHER','BODDULURI','BOFFETTA','BOGOLIUBOVA', 'BOLLINGER','BOLLS','BOMSZTYK','BONANNO','BONNER','BOOM','BOOTHROYD','BOPPANA','BORAWSKI','BORG','BORIS-LAWRIE','BORISY','BORLONGAN','BORNSTEIN','BORODOVSKY','BORST','BOS','BOTO','BOWDEN','BOWEN','BOYCE-JACINO','BRADEN','BRADY' ,'BRAITHWAITE','BRANN','BRASH','BRAUNSTEIN', 'BREMAN','BRENNAN','BRENNER','BRETSCHER','BREW','BREYSSE','BRIGGS','BRITES','BRITT','BRITTENHAM','BRODIE','BRODY','BROOK','BROOTEN','BROSCO','BROSNAN','BROWN','BROWNE','BRUCKNER','BRUNENGRABER','BRYL','BRYSON','BU','BUCHAN','BUDD','BUDNIK', 'BUEKENS','BUKRINSKY','BULLMORE','BULUN','BURBANO','BURGENER','BURGESS','BURKS','BURMEISTER','BURNETT','BURNHAM','BURNS','BURRIDGE','BURTON','BUSCIGLIO','BUSHEK','BUSIJA','BUZSAKI','BZYMEK','CABA') I need to have a regex which will greedily looks for up to 150 characters with a last character being a ','. And then replace the last ',' of the 150 with a <br /> Any suggestions pls? I used this ','(?=[^()]*\)) but this one replaces all the occurences. I want the 150th ones to be replaced. Thanks everyone for your suggestions. I managed to do it with Java code instead of regex. StringBuilder sb = new StringBuilder(html); int i = 0; while ((i = sb.indexOf("','", i + 150)) != -1) { int j = sb.lastIndexOf("','", i + 150); sb.insert(i+1, "<BR>"); } return sb.toString(); However, this breaks at the first encounter of ',' in the 150 chars. Can anyone help modify my code to incorporate the break at the last occurence of ',' withing the 150 chars.
You'll want something like this: Look for every occurrence of \([^)]+*,[^)]+*\) (Find a parenthesis-wrapped string with a comma in it and then run the following regular expression on each of the matched elements: (.{135,150}[^,]*?), The first number is the minimum number of characters you want to match before you add a break tag -- the second is the maximum number of characters you would like to match before inserting a break tag. If there is no , between the characters in question then the regular expression will continue to consume characters until it finds a comma.
You could probably do it like this: regex ~ /(^.{1,14}),/ replacement ~ '\1<replacement' or "$1<insert your text>" In Perl: $target = ','x 22; $target =~ s/(^ .{1,14}) , /$1<15th comma>/x; print $target; Output ,,,,,,,,,,,,,,<15th comma>,,,,,,, Edit: As an alternative, if you want to break the string up into succesive 150 or less you could do it this way: regex ~ /(.{1,150},)/sg replacement ~ '\1<br/>' or "$1<br\/>" // That is a regex of type global (/g) and include newlines (/s) In Perl: $target = " ('AARONSON','ABDEL MEGUID','ABDEL-LATIF','ABDOOL KARIM','ABELL','ABRAMS','ACKERMAN','ADAIR','ADAMS','ADAMS-CAMPBELL', 'ADASHI','ADEBAMOWO','ADHIKARI','ADIMORA','ADRIAN', 'ADZERIKHO','AGADJANYAN','AGARWAL','AGOT', 'AGUIRRE-CRUZ','AHMAD','AHMED','AIKEN', 'AINAMO', 'AISENBERG','AJAIYEOBA','AKA','AKHTAR','AKINGBEMI','AKINYINKA','AKKERMAN','AKSOY','AKYUREK', 'ALBEROLA-ILA','ALBERT','ALCANTARA' ,'ALCOCK','ALEMAN', 'ALEXANDER','ALEXANDRE','ALEXANDROV','ALEXANIAN','ALLAND','ALLEN','ALLISON','ALPER', 'ALTMAN', ... ) "; if ($target =~ s/( .{1,150} , )/$1<br\/>/sxg) { print $target; } Output: ('AARONSON','ABDEL MEGUID','ABDEL-LATIF','ABDOOL KARIM','ABELL','ABRAMS','ACKERMAN','ADAIR','ADAMS','ADAMS-CAMPBELL', 'ADASHI','ADEBAMOWO','ADHIKARI',<br/>'ADIMORA','ADRIAN', 'ADZERIKHO','AGADJANYAN','AGARWAL','AGOT', 'AGUIRRE-CRUZ','AHMAD','AHMED','AIKEN', 'AINAMO', 'AISENBERG','AJAIYEOBA','AKA',<br/>'AKHTAR','AKINGBEMI','AKINYINKA','AKKERMAN','AKSOY','AKYUREK', 'ALBEROLA-ILA','ALBERT','ALCANTARA' ,'ALCOCK','ALEMAN', 'ALEXANDER','ALEXANDRE',<br/>'ALEXANDROV','ALEXANIAN','ALLAND','ALLEN','ALLISON','ALPER', 'ALTMAN',<br/> ... )