I have a large set of JavaScript snippets each containing a line like:
function('some string without numbers', '123,71')
and I'm hoping to get a regex together to pull the numbers from the second argument. The second argument can contain an arbitrary number of comma separated numbers (inlcuding zero numbers), so the following are all valid:
''
'2'
'17,888'
'55,1,6000'
...
The regex '(?:\d+|,)*' successfully matches the quoted numbers, but I have no idea how to match each of the numbers. Placing a capture group around the \d+ seems to capture the last number (if there is one present -- it doesn't work if the second argument is just ''), but none of the others.
In your case, you may match and capture the digits inside the single quotes and then split them with a comma:
var s = "function('some string without numbers', '123,71')";
var res = s.match(/'([\d,]+)'/) || ["", ""];
console.log(res[1].split(','));
The /'([\d,]+)'/ regex will match a ', then 1+ digits or commas (placing that value into Group 1) and then a closing '.
If you want to run the regex globally, use
var s = "function('some string without numbers', '123,71')\nfunction('some string without numbers', '13,4,0')";
var rx = /'([\d,]+)'/g;
var res = [], m;
while ((m=rx.exec(s)) !== null) {
res.push(m[1].split(','));
}
console.log(res);
If you have a numbers in a variable x like this:
var x = '55,1,6000';
then use this to have the list of numbers:
var array = x.split(',');
If you can have some whitespace before/after the comma then use:
var array = x.split('\s*,\s*');
or something like that.
Sometimes it is easier to match the thing that you don't want and split on that.
Related
i am not understanding how can add commas after each class is copied i did it using for loop but it gives more different output than I want. There are around 9 div class of .name so when each one is copied i want add commas and remove extra space.
here is my code part:
const A = $('.tag-container.field-name').map((i, section) => {
let B = $(section).find('.name')
return B.text()
})
.get(2)
console.log(A)
Use trim and join:
$(css).get().map(el => $(el).text().trim()).join(', ')
There are two things you want to do here.
To remove any whitespace from the left or right-hand sides of a string (eg. from " foo " to "foo"), you can use the String.trim() method.
Regarding the second point, I assume that in adding commas, you want to end up with a string of classnames, separated with commas, like "foo,bar,baz". The .map method you are already using will return an array of something. You can join elements of an array together as a string with the Array.join() method. The join method takes a single argument which specifies the string to use in between each element.
Put those together, and you end up with something like:
const A = $(".tag-container.field-name")
.map((i, section) => {
let B = $(section).find(".name");
return B.text().trim(); // Note use of trim
})
.join(',') // Join all elements of the array with the `,` character
console.log(A);
// Something like `"foo,bar,baz"`
Quick question
If I am making a command like the following
!add {gamename}{gamedescription}{gamestatus}
How would I know that each argument is inside of the {}
I know the actual command is my first arg
let args = message.content.substring(PREFIX.length).split(" ");
switch(args[0]) {
case 'status':
PREFIX being the '!'
Just not sure how I set argument 1 has the first string inside of the first {} and so on.
This regular expression will do the trick. Test it out below.
const regex = /{(.+?)}/g;
const string = '!add {game}{game description}{game status}';
const args = [];
let match;
while (match = regex.exec(string)) args.push(match[1]);
console.log(args);
Explanation:
To see how the regex works and what each character does, check it out here. About the while loop, it iterates through each match from the regex and pushes the string from the first capturing group into the arguments array.
Small, but worthy note:
. does not match line breaks, so arguments split up into multiple lines within a message will not be included. To prevent this, you could replace any new line character with a space before using the regex.
You can use a regular expression to capture substrings in a pattern.
const message = {
content: '!add {gamename}{gamedescription}{gamestatus}'
};
const matches = message.content.match(/^!([a-zA-Z]+) {([a-zA-Z]+)}{([a-zA-Z]+)}{([a-zA-Z]+)}/);
if (matches) {
console.log(matches[1]); // add
console.log(matches[2]); // gamename
console.log(matches[3]); // gamedescription
console.log(matches[4]); // gamestatus
}
When the string matches the pattern, the matches object has substrings surrounded by () in matches[1], matches[2], matches[3] and matches[4]. matches[0] has the entire matched string (!add {gamename}{gamedescription}{gamestatus} in this case).
This is not a duplicate because all the other questions were not in AS3.
Here is my problem: I am trying to find some substrings that are in the "storage" string, that are in another string. I need to do this because my game server is sending the client random messages that contain on of the strings in the "storage" string. The strings sent from the server will always begin with: "AA_".
My code:
private var storage:String = AA_word1:AA_word2:AA_word3:AA_example1:AA_example2";
if(test.indexOf("AA_") >= 0) {
//i dont even know if this is right...
}
}
If there is a better way to do this, please let me know!
Why not just using String.split() :
var storage:String = 'AA_word1:AA_word2:AA_word3:AA_example1:AA_example2';
var a:Array = storage.split('AA_');
// gives : ,word1:,word2:,word3:,example1:,example2
// remove the 1st ","
a.shift();
trace(a); // gives : word1:,word2:,word3:,example1:,example2
Hope that can help.
Regular Expressions are the right tool for this job:
function splitStorage(storage: String){
var re: RegExp = /AA_([\w]+):?/gi;
// Execute the regexp until it
// stops returning results.
var strings = [];
var result: String;
while(result = re.exec(storage)){
strings.push(result[1]);
}
return strings;
}
The important part of this is the regular expression itself: /AA_([\w]+):?/gi
This says find a match starting with AA_, followed by one-or-more alphanumeric characters (which we capture) ([\w]+), optionally followed by a colon.
The match is then made global and case insensitive with /gi.
If you need to capture more than just letters and numbers - like this: "AA_word1 has spaces and [special-characters]:" - then add those characters to the character set inside the capture group.
e.g. ([-,.\[\]\s\w]+) will also match hyphen, comma, full-stop, square brackets, whitespace and alphanumeric characters.
Also you could do it with just one line, with a more advanced regular expression:
var storage:String = 'AA_word1:AA_word2:AA_word3:AA_example1:AA_example2';
const a:Array = storage.match(/(?<=AA_)\w+(?=:|$)/g);
so this means: one or more word char, preceeded by "AA_" and followed by ":" or the end of string. (note that "AA_" and ":" won't be included into the resulting match)
I'm not a regular expression expert, to say the least. What I'm looking for is a regular expression that extracts multiple values of a certain format from a string.
Example string:
"Customer [record:CustomerID] from [record:CityID] is of type [record:TypeID]"
What I need is an expression that gives me all values in this string that are of the format "[record:XXXXX]". So in this example it would give me:
["CustomerID", "CityID", "TypeID"]
Can it be done?
Actually, something like sed may do the trick, i.e.:
echo "Customer ..." | sed -e 's/\][^[]*\[record:/","/'g -e 's/^.*record:/["/' -e 's/].*$/"]/
In Javascript:
var pattern = '\\[record:([a-zA-Z0-9]+)\\]';
var records = new RegExp(pattern, 'g');
var extract = new RegExp(pattern);
var string = "Customer [record:CustomerID] from [record:CityID] is of type [record:TypeID]"
var matches = string.match(records);
console.log(matches);
> [ '[record:CustomerID]',
'[record:CityID]',
'[record:TypeID]' ]
var records = [];
for (var i=0; i<matches.length; i++) {
var match = matches[i].match(extract);
records.push(match[1]);
}
console.log(records)
> [ 'CustomerID',
'CityID',
'TypeID' ]
Possibly not the most concise solution, but clean and (hopefully) intelligible.
the square brackets that should not be treated specially are escaped by placing \ in front of them
the group to be extracted are wrapped in (), forming a regexp group/subpattern
the pattern [a-zA-Z0-9]+ means "match a string of letters (upper or lower case) or numbers" and the + specifies "of length one or more". A * here would mean "of length 0 or more".
Here I am using two regular expressions, based on the same pattern. They are compiled with different options: the g flag tells the regex to look for all matches in the string. With this flag, we don't get the groups that matched with the results, just the whole string that matched. The second regex is compiled without the g flag, so we can use it to extract the matched group.
In ActionScript3 i wanted to get the text between 2 quotes from some HTML using a input index value where i would simply increase the 2nd quote characters value by 1. This would be very simple however i have now noticed using indexOf does not seem to work correctly with quotes and other special characters.
So my question is if you have some HTML style text like this:
var MyText:String = '<div style="text-align:center;line-height:150%"><a href="http://www.website.com/page.htm">';
How can i correctly get the index of a quote " or other special character?
Currently i try this:
MyText.indexOf('"',1)
but after 0 it always returns the wrong index value.
Also a quick additional question would be is there a better way than using ' ' to store strings with characters like " inside? So if i had other ' characters etc it won't cause problems.
Edit -
This is the function i had created (usage = GetQuote(MyText,0) etc)
// GetQuote Function (Gets the content between quotes at a set index value)
function GetQuote(Input:String, Index:Number):String {
return String(Input.substr(Input.indexOf('"', Index), Input.indexOf('"', Index + 1)));
}
The return for GetQuote(MyText,0) is "text-align yet i need text-align:center;line-height:150% instead.
First off, index of the first quote is 11 and both MyString.indexOf('"') and MyString.indexOf('"',1) return the right value (the latter also works because you don't actually have a quote at the beginning of your string).
When you need to use an single quote inside another one or a double quote inside another one you need to escape the inner one(s) using backslashes. So to catch a single quote you would use it like '\''
There are several ways of stripping a value from a string. You can use the RegExp class or use standard String functions like indexOf, substr etc.
Now what exactly would you like the result to become? Your question is not obvious.
EDIT:
Using the RegExp class is much easier:
var myText:String = '<div style="text-align:center;line-height:150%"><a href="http://www.website.com/page.htm">';
function getQuote(input:String, index:int=0):String {
// I declared the default index as the first one
var matches:Array = [];
// create an array for the matched results
var rx:RegExp = /"(\\"|[^"])*"/g;
// create a RegExp rule to catch all grouped chars
// rule also includes escaped quotes
input.replace(rx,function(a:*) {
// if it's "etc." we want etc. only so...
matches.push(a.substr(1,a.length-2));
});
// above method does not replace anything actually.
// it just cycles in the input value and pushes
// captured values into the matches array.
return (index >= matches.length || index < 0) ? '' : matches[index];
}
trace('Index 0 -->',getQuote(myText))
trace('Index 1 -->',getQuote(myText,1))
trace('Index 2 -->',getQuote(myText,2))
trace('Index -1 -->',getQuote(myText,-1))
Outputs:
Index 0 --> text-align:center;line-height:150%
Index 1 --> http://www.website.com/page.htm
Index 2 -->
Index -1 -->