Home > Software engineering >  How to match a particular string using regex?
How to match a particular string using regex?

Time:02-26

Hi i have string like below,

apiVersion: v1
clusters:
- cluster:  <------------------------  this is one cluster
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ
    server: https://api.someaddress 
name: https://api.anotheraddress
- second_cluster:  <------------------------  this is second cluster
    certificate-authority-data: LS0tLS1
    server: https://api.someaddress
name: https://api.
contexts:
- context:  <------------------------  this is one context
    cluster: https://api.another1address
    namespace: name1           
    user: user1
 name: somename
- another_context:  <------------------------  this is second context
    cluster: https://api.anotheraddress
    namespace: esm2
    user: admin
name: somename1
current-context: some-context
kind: somekind
preferences: {}
users:
- name: user-admin
    user:
        token: eyJhb

how can i check if the there is more than one cluster under clusters and more than one context under contexts using regex.

i have tried something like below

var matchServer = new RegExp(/- cluster:\n[A-Za-z0-9\- :]*\n[ ] server: ([A-Za-z:.//]*)/, "gi").exec(s);
const namespace = s.match(/contexts:\n- context:\n[A-Za-z0-9\- :.//]*\n[ ] namespace: ([A-Za-z0-9]*)/i);

but this gives server and namespace also only one occurrence is returned.

i want to get the number of matched string "cluster" under clusters and context under contexts.

could someone help me with this. i am new to programming. thanks.

what i have tried?

i have tried regex to match "context" "another_context" under contexts. but it matches only "context"

contexts:\n-.*context:

could someone help me understand why it doesnt match the another_context string

CodePudding user response:

<html>
<head>
<script>
var s = `apiVersion: v1
clusters:
- cluster:  
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ
    server: https://api.someaddress1
name: https://api.anotheraddress
- second_cluster:  
    certificate-authority-data: LS0tLS1
    server: https://api.someaddress2
name: https://api.
contexts:
- context:  
    cluster: https://api.another1address
    namespace: name1           
    user: user1
 name: somename
- another_context: 
    cluster: https://api.anotheraddress
    namespace: esm2
    user: admin
name: somename1
current-context: some-context
kind: somekind
preferences: {}
users:
- name: user-admin
    user:
        token: eyJhb`;
 var matchServer = s.match(/- [a-z_]*cluster:/gi)
 var matchNamespace = s.match(/- [a-z_]*context:/gi)
 document.write(matchServer.length   ' servers <br/>')
 for(i=0;i<matchServer.length;i  )
  document.write(matchServer[i]   '<br/>')
 document.write(matchNamespace.length   ' namespaces <br/>')
 for(i=0;i<matchNamespace.length;i  )
  document.write(matchNamespace[i]   '<br/>')
</script>
</head>
<body>
</body>
</html>

js fiddle

CodePudding user response:

For completeness, here's a solution with a YAML parser - provided that it actually is YAML, because the last part (users) isn't valid YAML. Also some indentation wasn't right. I assume it has been modified to not leak sensitive information.

Update: Oh, I see this is a kubernetes config file. So it really is YAML then.

https://jsfiddle.net/1Lpsk740/ (with document.write instead of console.log)

<!DOCTYPE html>
<html>
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-yaml/4.1.0/js-yaml.js"></script>
<script>
var input = `apiVersion: v1
clusters:
- cluster:  
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ
    server: https://api.someaddress1
    name: https://api.anotheraddress
- second_cluster:  
    certificate-authority-data: LS0tLS1
    server: https://api.someaddress2
    name: https://api.
contexts:
- context:  
    cluster: https://api.another1address
    namespace: name1           
    user: user1
    name: somename
- another_context: 
    cluster: https://api.anotheraddress
    namespace: esm2
    user: admin
    name: somename1`;
const doc = jsyaml.load(input);
console.log('servers: '   doc.clusters.length);
doc.clusters.forEach(e => console.log('- '   Object.keys(e)[0]));
console.log('namespaces: '   doc.contexts.length);
doc.contexts.forEach(e => console.log('- '   Object.keys(e)[0]));
</script>
</html>

Output:

servers: 2
- cluster
- second_cluster
namespaces: 2
- context
- another_context
  • Related