RegExp
by Anton
JavaScript
let re = new RegExp('abc'); // or /abc/
console.log('re', re); // /abc/
console.log('test', re.test('00abc11'));
let nonBinaryRe = /[^01]/;
console.log('is non-binary', nonBinaryRe.test('00101010'));
let dateRe = /\d{4}-\d{1,2}-\d{1,2}/;
console.log('date', dateRe.test('1976-01-15'));
let dateReGroup = /\d{4}(-\d{1,2}){2}/;
console.log('date group', dateReGroup.test('1976-01-15'));
const numStr = "one two 100 three 40";
console.log('re.exec', /\d+/.exec(numStr));
console.log('str.match', numStr.match(/\d+/));
let [ full, month, day, year ] = /^(\d{1,2})-(\d{1,2})-(\d{4})$/.exec('1-15-1976');
console.log('date with .exec', new Date(year, month - 1, day));
console.log('word boundary', /\b[a-z]+/.exec('1 two three'));
console.log('choice pattern', /\b\d+\s+(cow|pig|chicken)s?\b/.exec('there are 2 pigs'));
// Replace with callback
let stock = "1 lemon, 2 cabbages, and 101 eggs";
function minusOne(match, amount, unit) {
amount = Number(amount) - 1;
if (amount == 1) { // only one left, remove the 's'
unit = unit.slice(0, unit.length - 1);
} else if (amount == 0) {
amount = "no";
}
return amount + " " + unit;
}
console.log(stock.replace(/(\d+) (\w+)/g, minusOne));
// → no lemon, 1 cabbage, and 100 eggs
// https://eloquentjavascript.net/09_regexp.html#i_vDM8PzwQWU
console.warn('Regex Golf exercises');
re = /ca(t|r)/i; // 1
console.log('car / cat', re.test('need to care'));
re = /pr?op/i; // 2
console.log('pop / prop', re.test('do you need a pop?'));
re = /ferr(et|y|ari)/i; // 3
console.log('ferret / ferry / ferrari', re.test('ferret me that'));
re = /\w+?ious\b/i; // 4
console.log('-ious', re.test('pretentious, huh?'));
re = /\s[.,:;]/; // 5
console.log('space before punctuation', re.test('pretentious, huh?'));
re = /\b\w{7,}\b/; // 6
console.log('word > 6 letters', re.test('short words only'));
re = /\b[a-df-z]+?\b/i;
console.log('no e', re.test('weild stare'));