How to refine results of a regular expression - regex

function getPrecedents(thisFormula){
var exp = /(\w+\!)?\$?[A-Z]{1,}(?:\d+)?(\:?\$?\w+)*(?!\()\b/gm;
var results=[];
var result;
while ((result=exp.exec(thisFormula))!== null){
results.push(result);
}
return results;
}
From the above code I am getting the following results
Trigger_Hires!$AA$15
AD$7
Trigger_Hires!$AC60
Trigger_Hires!$AB60
Rev
Import_Staffing!AD$16
Trigger_Hires!$AC60
Trigger_Hires!$AB60
Customers
Import_Staffing!AD$19
Trigger_Hires!$AC60
I would like to eliminate results that are just letters like Rev and Customers either with modified regexp or 2nd loop

I suggest adding a check before adding the match to the results array:
while (result=exp.exec(thisFormula)) {
if (!/^[A-Za-z]+$/.test(result[0]))
results.push(result[0]);
}
Note you need to access result[0] to get the whole regex match value. To check if the match value is all letters, ^[A-Za-z]+$ regex is used: ^ asserts the position at the start of the string, [A-Za-z]+ matches 1+ letters and $ asserts the position at the end of the string.

Related

regex to extract substring for special cases

I have a scenario where i want to extract some substring based on following condition.
search for any pattern myvalue=123& , extract myvalue=123
If the "myvalue" present at end of the line without "&", extract myvalue=123
for ex:
The string is abcdmyvalue=123&xyz => the it should return myvalue=123
The string is abcdmyvalue=123 => the it should return myvalue=123
for first scenario it is working for me with following regex - myvalue=(.?(?=[&,""]))
I am looking for how to modify this regex to include my second scenario as well. I am using https://regex101.com/ to test this.
Thanks in Advace!
Some notes about the pattern that you tried
if you want to only match, you can omit the capture group
e* matches 0+ times an e char
the part .*?(?=[&,""]) matches as least chars until it can assert eiter & , or " to the right, so the positive lookahead expects a single char to the right to be present
You could shorten the pattern to a match only, using a negated character class that matches 0+ times any character except a whitespace char or &
myvalue=[^&\s]*
Regex demo
function regex(data) {
var test = data.match(/=(.*)&/);
if (test === null) {
return data.split('=')[1]
} else {
return test[1]
}
}
console.log(regex('abcdmyvalue=123&3e')); //123
console.log(regex('abcdmyvalue=123')); //123
here is your working code if there is no & at end of string it will have null and will go else block there we can simply split the string and get the value, If & is present at the end of string then regex will simply extract the value between = and &
if you want to use existing regex then you can do it like that
var test = data1.match(/=(.*)&|=(.*)/)
const result = test[1] ? test[1] : test[2];
console.log(result);

DART Conditional find and replace using Regex

I have a string that sometimes contains a certain substring at the end and sometimes does not. When the string is present I want to update its value. When it is absent I want to add it at the end of the existing string.
For example:
int _newCount = 7;
_myString = 'The count is: COUNT=1;'
_myString2 = 'The count is: '
_rRuleString.replaceAllMapped(RegExp('COUNT=(.*?)\;'), (match) {
//if there is a match (like in _myString) update the count to value of _newCount
//if there is no match (like in _myString2) add COUNT=1; to the string
}
I have tried using a return of:
return "${match.group(1).isEmpty ? _myString + ;COUNT=1;' : 'COUNT=$_newCount;'}";
But it is not working.
Note that replaceAllMatched will only perform a replacement if there is a match, else, there will be no replacement (insertion is still a replacement of an empty string with some string).
Your expected matches are always at the end of the string, and you may leverage this in your current code. You need a regex that optionally matches COUNT= and then some text up to the first ; including the char and then checks if the current position is the end of string.
Then, just follow the logic: if Group 1 is matched, set the new count value, else, add the COUNT=1; string:
The regex is
(COUNT=[^;]*;)?$
See the regex demo.
Details
(COUNT=[^;]*;)? - an optional group 1: COUNT=, any 0 or more chars other than ; and then a ;
$ - end of string.
Dart code:
_myString.replaceFirstMapped(RegExp(r'(COUNT=[^;]*;)?$'), (match) {
return match.group(0).isEmpty ? "COUNT=1;" : "COUNT=$_newCount;" ; }
)
Note the use of replaceFirstMatched, you need to replace only the first match.

Regex Express Return All Chars before a '/' but if there are 2 '/' Return all before that

I have been trying to get a regex expression to return me the following in the following situations.
XX -> XX
XXX -> XXX
XX/XX -> XX
XX/XX/XX -> XX/XX
XXX/XXX/XX -> XXX/XXX
I had the following Regex, however they do no work.
^[^/]+ => https://regex101.com/r/xvCbNB/1
=========
([A-Z])\w+ => https://regex101.com/r/xvCbNB/2
They are close but are not there.
Any Help would be appreciated.
You want to get all text from the start till the last occurrence of a specific character or till the end of string if the character is missing.
Use
^(?:.*(?=\/)|.+)
See the regex demo and the regex graph:
Details
^ - start of string
(?:.*(?=\/)|.+) - a non-capturing group that matches either of the two alternatives, and if the first one matches first the second won't be tried:
.*(?=\/) - any 0+ chars other than line break chars, as many as possible upt to but excluding /
| - or
.+ - any 1+ chars other than line break chars, as many as possible.
It will be easier to use a replace here to match / followed by non-slash characters before end of line:
Search regex:
/[^/]*$
Replacement String:
""
Updated RegEx Demo 1
If you're looking for a regex match then use this regex:
^(.*?)(?:/[^/]*)?$
Updated RegEx Demo 2
Any special reason it has to be a regular expression? How about just splitting the string at the slashes, remove the last item and rejoin:
function removeItemAfterLastSlash(string) {
const list = string.split(/\//);
if (list.length == 1) [
return string;
}
list.pop();
return list.join("/");
}
Or look for the last slash an remove it:
function removeItemAfterLastSlash(string) {
const index = string.lastIndexOf("/");
if (index === -1) {
return string;
}
return string.splice(0, index);
}

c# Regex expression to extract all non-numeric values in brackets

This is the Regex expression i have built so far \{([^{]*[^0-9])\}.
"This is the sample string {0} {1} {} {abc} {12abc} {abc123}"
I wish to extract everything within the string that includes brackets and that does not contain only an integer.
(e.g) '{}'
'{abc}' '{12abc}' '{abc123}'
However the last one which contains numbers at the end is not extracted with the rest.
{abc123}
How can i extract all values in the string that are in curly brackets and do not contain an Integer?
You may use
var res = Regex.Matches(s, #"{(?!\d+})[^{}]*}")
.Cast<Match>()
.Select(x => x.Value)
.ToList();
See the regex demo and the online C# demo.
Pattern details
{ - a { char
(?!\d+}) - no 1+ digits and then } allowed immediately to the right of the current location
[^{}]* - 0+ chars other than { and }
} - a } char.

RegEx to find a string before the last semi-colon

I have the following regex /\.(\w+)/g represented here
It's matching against this sample string: function () {__cov_0vpZ06dQffa98X1ZQ0lWVA.f['74']++;__cov_0vpZ06dQffa98X1ZQ0lWVA.s['211']++;return t.propertygroup.subproperty1;}
Right now it's matching "f.s.propertygroup.subproperty1", but I want it to match only "propertyGroup.subproperty1" or if it was just t.subproperty1 it would just match "subproperty1". So it should find all words after the first period, but only before the last occurrence of the semi-colon.
The function string above is dynamic (JavaScript) so it might add additional statements with additional semi-colons at any time, but I still want to match only the last return variable name.
I've been fighting this regex all day and you, a regex guru, could probably solve this in 5 minutes. Can you help?
Use a positive lookahead:
\.(\w+)(?=[^;]*;[^;]*$)
^^^^^^^^^^^^^^^^
See the regex demo
The (?=[^;]*;[^;]*$) will only match the . + word chars if they are followed with 0+ chars other than ;, then ; and again 0+ chars other than ; up to the end of string.
JS code:
var regex = /\.(\w+)(?=[^;]*;[^;]*$)/g;
var str = "function () {__cov_0vpZ06dQffa98X1ZQ0lWVA.f['74']++;__cov_0vpZ06dQffa98X1ZQ0lWVA.s['211']++;return t.propertygroup.subproperty1;}";
var res = [], m;
while ((m = regex.exec(str)) !== null) {
res.push(m[1]);
}
console.log(res);
Or another one:
var s = "function () {__cov_0vpZ06dQffa98X1ZQ0lWVA.f['74']++;__cov_0vpZ06dQffa98X1ZQ0lWVA.s['211']++;return t.propertygroup.subproperty1;}";
var res = s.match(/\.(\w+)(?=[^;]*;[^;]*$)/g).map(function(x) {return x.slice(1);});
console.log(res);
perhaps this is the one you need?
#"\.([a-zA-Z0-9_.]+)[^;]*;[^;]*}$"
demo