GithubHelp home page GithubHelp logo

learn-regex's Introduction


Learn Regex

Translations:

What is Regular Expression?

Download PDF

A regular expression is a group of characters or symbols which is used to find a specific pattern in a text.

A regular expression is a pattern that is matched against a subject string from left to right. Regular expressions are used to replace text within a string, validate forms, extract a substring from a string based on a pattern match, and so much more. The term "regular expression" is a mouthful, so you will usually find the term abbreviated to "regex" or "regexp".

Imagine you are writing an application and you want to set the rules for when a user chooses their username. We want to allow the username to contain letters, numbers, underscores and hyphens. We also want to limit the number of characters in the username so it does not look ugly. We can use the following regular expression to validate the username:



Regular expression

The regular expression above can accept the strings john_doe, jo-hn_doe and john12_as. It does not match Jo because that string contains an uppercase letter and also it is too short.

Table of Contents

1. Basic Matchers

A regular expression is just a pattern of characters that we use to perform a search in a text. For example, the regular expression the means: the letter t, followed by the letter h, followed by the letter e.

"the" => The fat cat sat on the mat.

Test the regular expression

The regular expression 123 matches the string 123. The regular expression is matched against an input string by comparing each character in the regular expression to each character in the input string, one after another. Regular expressions are normally case-sensitive so the regular expression The would not match the string the.

"The" => The fat cat sat on the mat.

Test the regular expression

2. Meta Characters

Meta characters are the building blocks of regular expressions. Meta characters do not stand for themselves but instead are interpreted in some special way. Some meta characters have a special meaning and are written inside square brackets. The meta characters are as follows:

Meta character Description
. Period matches any single character except a line break.
[ ] Character class. Matches any character contained between the square brackets.
[^ ] Negated character class. Matches any character that is not contained between the square brackets
* Matches 0 or more repetitions of the preceding symbol.
+ Matches 1 or more repetitions of the preceding symbol.
? Makes the preceding symbol optional.
{n,m} Braces. Matches at least "n" but not more than "m" repetitions of the preceding symbol.
(xyz) Character group. Matches the characters xyz in that exact order.
| Alternation. Matches either the characters before or the characters after the symbol.
\ Escapes the next character. This allows you to match reserved characters [ ] ( ) { } . * + ? ^ $ \ |
^ Matches the beginning of the input.
$ Matches the end of the input.

2.1 The Full Stop

The full stop . is the simplest example of a meta character. The meta character . matches any single character. It will not match return or newline characters. For example, the regular expression .ar means: any character, followed by the letter a, followed by the letter r.

".ar" => The car parked in the garage.

Test the regular expression

2.2 Character Sets

Character sets are also called character classes. Square brackets are used to specify character sets. Use a hyphen inside a character set to specify the characters' range. The order of the character range inside the square brackets doesn't matter. For example, the regular expression [Tt]he means: an uppercase T or lowercase t, followed by the letter h, followed by the letter e.

"[Tt]he" => The car parked in the garage.

Test the regular expression

A period inside a character set, however, means a literal period. The regular expression ar[.] means: a lowercase character a, followed by the letter r, followed by a period . character.

"ar[.]" => A garage is a good place to park a car.

Test the regular expression

2.2.1 Negated Character Sets

In general, the caret symbol represents the start of the string, but when it is typed after the opening square bracket it negates the character set. For example, the regular expression [^c]ar means: any character except c, followed by the character a, followed by the letter r.

"[^c]ar" => The car parked in the garage.

Test the regular expression

2.3 Repetitions

The meta characters +, * or ? are used to specify how many times a subpattern can occur. These meta characters act differently in different situations.

2.3.1 The Star

The * symbol matches zero or more repetitions of the preceding matcher. The regular expression a* means: zero or more repetitions of the preceding lowercase character a. But if it appears after a character set or class then it finds the repetitions of the whole character set. For example, the regular expression [a-z]* means: any number of lowercase letters in a row.

"[a-z]*" => The car parked in the garage #21.

Test the regular expression

The * symbol can be used with the meta character . to match any string of characters .*. The * symbol can be used with the whitespace character \s to match a string of whitespace characters. For example, the expression \s*cat\s* means: zero or more spaces, followed by a lowercase c, followed by a lowercase a, followed by a lowercase t, followed by zero or more spaces.

"\s*cat\s*" => The fat cat sat on the concatenation.

Test the regular expression

2.3.2 The Plus

The + symbol matches one or more repetitions of the preceding character. For example, the regular expression c.+t means: a lowercase c, followed by at least one character, followed by a lowercase t. It needs to be clarified thatt is the last t in the sentence.

"c.+t" => The fat cat sat on the mat.

Test the regular expression

2.3.3 The Question Mark

In regular expressions, the meta character ? makes the preceding character optional. This symbol matches zero or one instance of the preceding character. For example, the regular expression [T]?he means: Optional uppercase T, followed by a lowercase h, followed by a lowercase e.

"[T]he" => The car is parked in the garage.

Test the regular expression

"[T]?he" => The car is parked in the garage.

Test the regular expression

2.4 Braces

In regular expressions, braces (also called quantifiers) are used to specify the number of times that a character or a group of characters can be repeated. For example, the regular expression [0-9]{2,3} means: Match at least 2 digits, but not more than 3, ranging from 0 to 9.

"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.

Test the regular expression

We can leave out the second number. For example, the regular expression [0-9]{2,} means: Match 2 or more digits. If we also remove the comma, the regular expression [0-9]{3} means: Match exactly 3 digits.

"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.

Test the regular expression

"[0-9]{3}" => The number was 9.9997 but we rounded it off to 10.0.

Test the regular expression

2.5 Capturing Groups

A capturing group is a group of subpatterns that is written inside parentheses (...). As discussed before, in regular expressions, if we put a quantifier after a character then it will repeat the preceding character. But if we put a quantifier after a capturing group then it repeats the whole capturing group. For example, the regular expression (ab)* matches zero or more repetitions of the character "ab". We can also use the alternation | meta character inside a capturing group. For example, the regular expression (c|g|p)ar means: a lowercase c, g or p, followed by a, followed by r.

"(c|g|p)ar" => The car is parked in the garage.

Test the regular expression

Note that capturing groups do not only match, but also capture, the characters for use in the parent language. The parent language could be Python or JavaScript or virtually any language that implements regular expressions in a function definition.

2.5.1 Non-Capturing Groups

A non-capturing group is a capturing group that matches the characters but does not capture the group. A non-capturing group is denoted by a ? followed by a : within parentheses (...). For example, the regular expression (?:c|g|p)ar is similar to (c|g|p)ar in that it matches the same characters but will not create a capture group.

"(?:c|g|p)ar" => The car is parked in the garage.

Test the regular expression

Non-capturing groups can come in handy when used in find-and-replace functionality or when mixed with capturing groups to keep the overview when producing any other kind of output. See also 4. Lookaround.

2.6 Alternation

In a regular expression, the vertical bar | is used to define alternation. Alternation is like an OR statement between multiple expressions. Now, you may be thinking that character sets and alternation work the same way. But the big difference between character sets and alternation is that character sets work at the character level but alternation works at the expression level. For example, the regular expression (T|t)he|car means: either (an uppercase T or a lowercase t, followed by a lowercase h, followed by a lowercase e) OR (a lowercase c, followed by a lowercase a, followed by a lowercase r). Note that I included the parentheses for clarity, to show that either expression in parentheses can be met and it will match.

"(T|t)he|car" => The car is parked in the garage.

Test the regular expression

2.7 Escaping Special Characters

A backslash \ is used in regular expressions to escape the next character. This allows us to include reserved characters such as { } [ ] / \ + * . $ ^ | ? as matching characters. To use one of these special character as a matching character, prepend it with \.

For example, the regular expression . is used to match any character except a newline. Now, to match . in an input string, the regular expression (f|c|m)at\.? means: a lowercase f, c or m, followed by a lowercase a, followed by a lowercase t, followed by an optional . character.

"(f|c|m)at\.?" => The fat cat sat on the mat.

Test the regular expression

2.8 Anchors

In regular expressions, we use anchors to check if the matching symbol is the starting symbol or ending symbol of the input string. Anchors are of two types: The first type is the caret ^ that checks if the matching character is the first character of the input and the second type is the dollar sign $ which checks if a matching character is the last character of the input string.

2.8.1 The Caret

The caret symbol ^ is used to check if a matching character is the first character of the input string. If we apply the following regular expression ^a (meaning 'a' must be the starting character) to the string abc, it will match a. But if we apply the regular expression ^b to the above string, it will not match anything. Because in the string abc, the "b" is not the starting character. Let's take a look at another regular expression ^(T|t)he which means: an uppercase T or a lowercase t must be the first character in the string, followed by a lowercase h, followed by a lowercase e.

"(T|t)he" => The car is parked in the garage.

Test the regular expression

"^(T|t)he" => The car is parked in the garage.

Test the regular expression

2.8.2 The Dollar Sign

The dollar sign $ is used to check if a matching character is the last character in the string. For example, the regular expression (at\.)$ means: a lowercase a, followed by a lowercase t, followed by a . character and the matcher must be at the end of the string.

"(at\.)" => The fat cat. sat. on the mat.

Test the regular expression

"(at\.)$" => The fat cat. sat. on the mat.

Test the regular expression

3. Shorthand Character Sets

There are a number of convenient shorthands for commonly used character sets/ regular expressions:

Shorthand Description
. Any character except new line
\w Matches alphanumeric characters: [a-zA-Z0-9_]
\W Matches non-alphanumeric characters: [^\w]
\d Matches digits: [0-9]
\D Matches non-digits: [^\d]
\s Matches whitespace characters: [\t\n\f\r\p{Z}]
\S Matches non-whitespace characters: [^\s]

4. Lookarounds

Lookbehinds and lookaheads (also called lookarounds) are specific types of non-capturing groups (used to match a pattern but without including it in the matching list). Lookarounds are used when a pattern must be preceded or followed by another pattern. For example, imagine we want to get all numbers that are preceded by the $ character from the string $4.44 and $10.88. We will use the following regular expression (?<=\$)[0-9\.]* which means: get all the numbers which contain the . character and are preceded by the $ character. These are the lookarounds that are used in regular expressions:

Symbol Description
?= Positive Lookahead
?! Negative Lookahead
?<= Positive Lookbehind
?<! Negative Lookbehind

4.1 Positive Lookahead

The positive lookahead asserts that the first part of the expression must be followed by the lookahead expression. The returned match only contains the text that is matched by the first part of the expression. To define a positive lookahead, parentheses are used. Within those parentheses, a question mark with an equals sign is used like this: (?=...). The lookahead expressions is written after the equals sign inside parentheses. For example, the regular expression (T|t)he(?=\sfat) means: match either a lowercase t or an uppercase T, followed by the letter h, followed by the letter e. In parentheses we define a positive lookahead which tells the regular expression engine to match The or the only if it's followed by the word fat.

"(T|t)he(?=\sfat)" => The fat cat sat on the mat.

Test the regular expression

4.2 Negative Lookahead

Negative lookaheads are used when we need to get all matches from an input string that are not followed by a certain pattern. A negative lookahead is written the same way as a positive lookahead. The only difference is, instead of an equals sign =, we use an exclamation mark ! to indicate negation i.e. (?!...). Let's take a look at the following regular expression (T|t)he(?!\sfat) which means: get all The or the words from the input string that are not followed by a space character and the word fat.

"(T|t)he(?!\sfat)" => The fat cat sat on the mat.

Test the regular expression

4.3 Positive Lookbehind

Positive lookbehinds are used to get all the matches that are preceded by a specific pattern. Positive lookbehinds are written (?<=...). For example, the regular expression (?<=(T|t)he\s)(fat|mat) means: get all fat or mat words from the input string that come after the word The or the.

"(?<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat.

Test the regular expression

4.4 Negative Lookbehind

Negative lookbehinds are used to get all the matches that are not preceded by a specific pattern. Negative lookbehinds are written (?<!...). For example, the regular expression (?<!(T|t)he\s)(cat) means: get all cat words from the input string that are not after the word The or the.

"(?<!(T|t)he\s)(cat)" => The cat sat on cat.

Test the regular expression

5. Flags

Flags are also called modifiers because they modify the output of a regular expression. These flags can be used in any order or combination, and are an integral part of the RegExp.

Flag Description
i Case insensitive: Match will be case-insensitive.
g Global Search: Match all instances, not just the first.
m Multiline: Anchor meta characters work on each line.

5.1 Case Insensitive

The i modifier is used to perform case-insensitive matching. For example, the regular expression /The/gi means: an uppercase T, followed by a lowercase h, followed by an e. And at the end of regular expression the i flag tells the regular expression engine to ignore the case. As you can see, we also provided g flag because we want to search for the pattern in the whole input string.

"The" => The fat cat sat on the mat.

Test the regular expression

"/The/gi" => The fat cat sat on the mat.

Test the regular expression

5.2 Global Search

The g modifier is used to perform a global match (finds all matches rather than stopping after the first match). For example, the regular expression/.(at)/g means: any character except a new line, followed by a lowercase a, followed by a lowercase t. Because we provided the g flag at the end of the regular expression, it will now find all matches in the input string, not just the first one (which is the default behavior).

"/.(at)/" => The fat cat sat on the mat.

Test the regular expression

"/.(at)/g" => The fat cat sat on the mat.

Test the regular expression

5.3 Multiline

The m modifier is used to perform a multi-line match. As we discussed earlier, anchors (^, $) are used to check if a pattern is at the beginning of the input or the end. But if we want the anchors to work on each line, we use the m flag. For example, the regular expression /at(.)?$/gm means: a lowercase a, followed by a lowercase t and, optionally, anything except a new line. And because of the m flag, the regular expression engine now matches patterns at the end of each line in a string.

"/.at(.)?$/" => The fat
                cat sat
                on the mat.

Test the regular expression

"/.at(.)?$/gm" => The fat
                  cat sat
                  on the mat.

Test the regular expression

6. Greedy vs Lazy Matching

By default, a regex will perform a greedy match, which means the match will be as long as possible. We can use ? to match in a lazy way, which means the match should be as short as possible.

"/(.*at)/" => The fat cat sat on the mat. 

Test the regular expression

"/(.*?at)/" => The fat cat sat on the mat. 

Test the regular expression

Contribution

  • Open a pull request with improvements
  • Discuss ideas in issues
  • Spread the word
  • Reach out with any feedback Twitter URL

License

MIT © Zeeshan Ahmad

learn-regex's People

Contributors

aykutkardas avatar bueltge avatar chroju avatar dandanio avatar donotrsp avatar edgarallanzp avatar enisozgen avatar falaktheoptimist avatar hjavadish avatar imba-tjd avatar imkifu avatar imyhui avatar janosorcsik avatar johnnyjayjay avatar maikuolan avatar mcantonbul avatar mrtheyann avatar munkacsimark avatar piperchester avatar ponsfrilus avatar pravdakotchestno avatar recurduck avatar sahibyar avatar seasle avatar sezeresim avatar tibor avatar tommcandrew avatar wicksome avatar zessx avatar ziishaned avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

learn-regex's Issues

Problem with updating Translation links

I detect the problem with the update the translations links. When someboy make a new translation, he/she shall add the translation link to all README-*.md.

Maybe will be interest to think a new mechanism for that.

But this solution come to late? is neccessary realize this change now?

Missing a section on theory

This article unfortunately fails to mention asymptotic run times (hint O(characters*vertices)) which is the most import reason why we use regex! They run in linear time. Showing a little theory will help beginners realize that regular expressions are mathematical at their core. Perhaps include a "further reading" section and link to the best implementation guide ever created

Here is a little nondeterministic finite automaton I created for you. Enjoy.

ze?|(e|sh|a*)+|nu

screen shot 2017-08-10 at 4 56 17 am

And its compiled DFA

StateTransitions
inputnext
0
{ 1, 2, 7, 14, 16, 21 }"z"1
"n"2
"e"3
"s"4
"a"3
1
{ 1, 12 }"e"5
2
{ 9 }"u"5
3
{ 1, 14, 16, 21 }"e"3
"s"4
"a"3
4
{ 18 }"h"3
5
{ 1 }*-1

I believe a small blurb on theory is within the scope of any regex guide.

Positive integers

The positive integers regex will also match the negative integers since it matches all integers.

"<" character entered as "&lt;"

In section 4.4 Negative Lookbehind, the example regex is written as (?&lt;!(T|t)he\s)(cat) intread of (?<!(T|t)he\s)(cat)

Confusing example in 2.4 Braces

Referencing 2.4 Braces:

We can leave out the second number. For example, the regular expression [0-9]{2,} means: Match 2 or more digits. If we also remove the comma the regular expression [0-9]{2} means: Match exactly 2 digits.

"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.

Test the regular expression

"[0-9]{2}" => The number was 9.9997 but we rounded it off to 10.0.

Test the regular expression

The substrings matched in both examples are identical, which is kind of confusing. Maybe we can change the example to "[0-9]{3,}" and "[0-9]{3}", or something else.

Exercises section.

It would be really nice to create some exercises section where you can try to explain regex by yourself and in case of fail to look into some explanation.

German Translation

Hey, great project that could use a German translation. I would like to start a WIP PR and let other join in.

What do you think?

Missing back references

Most regular expression engines support back references, its probably worth having a section to discuss how they can be used.

Global Flag

I believe somewhere in the introduction, it should be stated that all the examples assume the use of the global search flag.

Email regex misleading

parsing emails with regex is hard and complicated. There are many solutions that work almost fine but can cause problems on edge cases.

I think replacing the regex with full rfc 5322 is obviously ridiculous but maybe adding a note would be a good idea.

正则报错

手机国家号: ^+?[\d\s]{3,}$
手机号: ^+?[\d\s]+(?[\d\s]{10,}$

这两个正则都是错的。。。。

Bonus part issues

Hi @ZeeSHANU,
Thanks for the great project.
I think you should take a look on the Bonus part again since there're some problems here:

  1. US Phone Number: ^+?[\d\s]{3,}$ => ^\+?[\d\s-]{3,}$
  2. US Phone with code: ^+?[\d\s]+(?[\d\s]{10,}$ => I don't get it, but at least you need to escape \+ and missing a ) here.
  3. Redundant parentheses:
    Lowercase letters only: ^([a-z])*$ => ^[a-z]*$
    Uppercase letters only: ^([A-Z])*$ => ^[A-Z]*$

Add examples section

Hi. It would be awesome to add examples section where everyone can contribute their problem and solution with short explanation. Initially it can be fulfilled with some common items like emails and file extensions matchers and then it can be extended by less common and way more tricky ones

理解问题

?=... 前置约束(存在), 表示第一部分表达式必须跟在 ?=...定义的表达式之后.

结尾处『定义的表达式之后』如何理解,感觉是『之前』呢?

example in 4.3 in README-cn.md

4.3 ?<= ... 正后发断言

"(?<=(T|t)he\s)(fat|mat)" => The fat cat sat on the mat. ==>
should be ### "(?<=[Tt]he\s)(fat|mat)" => The fat cat sat on the mat.

Specificity of examples

A few of the examples don't make clear why we should be using such complex structures instead of very simpler or similar ones.

  • Star: instead of "\scat\s", a "cat" would suffice.

  • Question mark: instead of using "[T]?he", a simple "T*he" would yield the same result.

  • Plus: using either /c.*t/ or /c.+t/ would be the same.

  • Some section 2 examples with Capturing Groups (including Alternation and Escaping) could just be using a character set, instead of a capturing group, while in some cases (Dollar) we could just skip the group altogether.

I think the value of the examples would be much greater, finding more unique cases.

Missing POSIX notation like [:digit:] and [:alpha:]

Look at the table at the middle of this page.

Everytime you write [a-zA-Z0-9] to select letters and digits, you can write [:alnum:] instead. Another example is when you want to select whitespace. You can write [ \t\r\n\v\f] for spaces, tabs, carriage return, newlines, vertical tabs and page breaks (all of which you would have to remember), or you write [:space:].

Russian translation

  • Hello, I've found this repository very useful for begginers, so I decide to translate it to Russian.
    I've seen a similar issue from 2017 but it looks like this translation is kinda abandoned now.

  • I made a fork of this repo so I could merge it later when job would be done.
    Readme file for translators asks to create an issue for a collaboration with other translators, however, it seems like there is not too much of work in here to do, so I am able to translate this all alone.

  • I'll be right back in here when job would be done, cheers.

Star example

From the page:

For example, the expression \scat\s means: zero or more spaces, followed by lowercase character c, followed by lowercase character a, followed by lowercase character t, followed by zero or more spaces.

"\scat\s" => The fat cat sat on the concatenation.

But that doesn't seem a good example, since just writing \cat\ would be the same.

Typo in regexp-en.png file

The second square closing brace should be the curly brace to represent quantifiers properly. So, the regex should be ^[a-z0-9_-]{3,15}$ rather than ^[a-z0-9_-]{3,15]$.

WIP Russian translation

Hey! I'm now doing a Russian translation of this repository in my own fork (In the pinned repositories first).

Note

  • I used Vim to edit the file and Notepad++ to convert CR LF line ending to LF one

Various issues

In 2.3.1, I'm pretty sure that the T at the start won't be matched because you only gave lowercase in your range [a-z].

In 2.4, the first and 3rd examples are the same, I think you meant to do {2,3} as the first example.

regex-flavor information

There is no information regarding regular-expression flavors, a description of it should be there.

[T|t] doesn't mean T or t, it means T I t

The doc shows example with [T|t], which is telling us it means T or t, that is to say:
/[T|t]/.test("The") and [T|t].test("the") return true.
But actually /[T|t]/.test("|") also returns true.
I think the doc should be updated with [Tt] or (T|t) instead of [T|t].

A few grammatical errors

I noticed there are a few grammatical errors:

In section 4. Lookaround this part:
"which means: get all the numbers which contains . character and preceded by $ character."
Should be modified to:
"which means: get all the numbers which contain. character and are preceded by $ character."

Also, in section 2.5:
"As we discussed before that in regular expression if we put a quantifier after a character than it will repeat the preceding character."
Should be modified to:
"As we discussed before that in regular expression if we put a quantifier after a character then it will repeat the preceding character."

$ is problematic

This is a pet of mine – in (almost all) regex engines, $ means "end of input possibly preceded by a newline", whereas \z means "end of input".

It would be worth stating the difference here, as using $ can lead to broken validation regexes (consider the harm of being able to inject newlines in places they aren't expected, or being able to put an additional character after length validation, for example).

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.