2012-12-19 17 views
7

संभव डुप्लिकेट:
How to get function parameter names/values dynamically from javascriptनियमित अभिव्यक्ति समारोह परिभाषा से पैरामीटर सूची प्राप्त करने

मैं वर्तमान में जावास्क्रिप्ट (Node.js) में एक परियोजना पर काम कर रहा हूँ है कि मुझे करने की कोशिश कर एक समारोह से पैरामीटर नाम की एक सरणी (नहीं मान, मैं तर्क की जरूरत नहीं है) मिलता है। मैं वर्तमान में फ़ंक्शन स्ट्रिंग प्राप्त करने के लिए Function.toString() का उपयोग कर रहा हूं और उसके बाद मेरी पैरामीटर सूची प्राप्त करने के लिए इसके खिलाफ एक रेगेक्स चला रहा हूं।

paramList = ['paramOne', 'paramTwo'] 
: मैं एक सरणी वापस इस तरह उम्मीद करेंगे

var myFunction = function (paramOne, paramTwo) { ... } 

इस के खिलाफ मेरी regex चल रहा है, और फिर कुछ स्ट्रिंग जादू (विभाजन, आदि) कर रही:

के निम्नलिखित सरल उदाहरण लेते हैं

मैं कुछ है कि काम करता है लेकिन यह शायद सबसे अच्छा समाधान आप चर नाम के लिए इस्तेमाल करते हैं और है कि जावास्क्रिप्ट आप एकाधिक पंक्तियों में कार्यों को परिभाषित करने देगा देता है जावास्क्रिप्ट फंकी पात्रों में से कुछ दिया नहीं है जैसे मैं महसूस कर रहा हूँ।

function.*[\w\s$]*(\((.*[\w\s,$]*)\)) 

यह मुझे मेरे "मैच" देता है समूह 1 में और उसके बाद समूह 2, जो अच्छा है में कोष्ठक के बिना मेरे परम सूची:

यहाँ मैं वर्तमान में क्या है। क्या यह वास्तव में करने का सबसे अच्छा तरीका है जो मैं चाहता हूं? क्या इसके लिए एक बेहतर नियमित अभिव्यक्ति है जिसका उपयोग मैं कर सकता हूं? मैं वास्तव में कुछ "सरल" की तलाश नहीं कर रहा हूं, लेकिन वास्तव में कुछ ऐसा है जो सभी संभावित स्थितियों को पकड़ सकता है।

किसी भी मदद की सराहना की है, और अग्रिम में बहुत धन्यवाद!

उत्तर

16

सबसे आसान काम कोष्ठक के पहले सेट में सब कुछ पर कब्जा, और फिर split(/\s*,\s*/) का उपयोग सरणी प्राप्त करने के लिए होगा।

उदाहरण के लिए:

var str = "function( one ,\ntwo,three , four ) { laksjdfl akjsdflkasjdfl }"; 
 
var args = /\(\s*([^)]+?)\s*\)/.exec(str); 
 
if (args[1]) { 
 
    args = args[1].split(/\s*,\s*/); 
 
} 
 
snippet.log("args: " + JSON.stringify(args));
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

कैसे ऊपर काम करता है:

  1. हम /\(*([^)]+?) *\)/ का उपयोग पहले आरंभिक कोष्ठक मैच के लिए (\(( के बाद से regexes में क्या खास बात है), वैकल्पिक कैटस्पेस की किसी भी मात्रा के बाद, कैप्चर समूह सी के बाद apturing सब कुछ है, लेकिन एक समापन कोष्ठक (लेकिन गैर लालची), वैकल्पिक खाली स्थान के की किसी भी राशि के द्वारा पीछा किया, समापन ) द्वारा पीछा किया।

  2. यदि हम सफल होते हैं, तो हम /\s*,\s*/ का उपयोग कर विभाजित करते हैं, जिसका मतलब है कि हम दृश्यों जो शून्य या अधिक खाली स्थान के वर्ण (\s*) एक अल्पविराम शून्य या अधिक खाली स्थान के पात्रों द्वारा पीछा के बाद कर रहे हैं पर विभाजित (यह खाली स्थान के बात क्यों में आर्ग है मेरा उदाहरण समारोह बहुत अजीब है)।

आप उदाहरण से देख सकते हैं, इस अग्रणी खाली स्थान के (( के बाद और इससे पहले कि पहला तर्क) संभालती है, अल्पविराम के आसपास खाली स्थान के, और पिछली श्वेत रिक्ति   — लाइन विच्छेद सहित। यह तर्क सूची में टिप्पणियों को संभालने का प्रयास करता है, जो चीजों को जटिल रूप से जटिल करेगा।


साइड नोट: अपने लक्ष्य ब्राउज़र पर परीक्षण करने के लिए सुनिश्चित करें, Function#toString स्रोत कोड के कुछ फार्म लौटने एक गैर मानक सुविधा है। यह व्यापक रूप से समर्थित है (डेस्कटॉप ब्राउज़र में), लेकिन मानक नहीं है। ध्यान दें कि कुछ ब्राउज़रों में टिप्पणियां शामिल होंगी, अन्य नहीं होंगे; अगर किसी में फ़ंक्शन तर्कों में टिप्पणियां शामिल हैं, तो यह आपके पार्सिंग को अच्छी तरह से खराब कर सकती है।

var ar = str.match(/\((.*?)\)/); 
if (ar) { 
    var result = ar[0].split(","); 
} 

याद रखें: आप निम्नलिखित के रूप में Prototype source code for its Function#argumentNames extension चारों ओर लात सकता है, के रूप में वे पहले से ही इस सड़क के नीचे किया गया है ...

+0

आपको कैसे लगता है कि मुझे इसके बारे में जाना चाहिए? यही वह है जो मैं अपने रेगेक्स के साथ करने की कोशिश कर रहा हूं, लेकिन शायद एक अलग दृष्टिकोण है? क्या आप सोच रहे हैं कि मैं सिर्फ "(" और ")" से इंडेक्स कर सकता हूं और फिर बीच में क्या विभाजित कर सकता हूं? क्या वह पागल रेगेक्स से बेहतर होगा? –

+0

@ जेसनएल .: मैंने उत्तर में कुछ कोड जोड़ा (और एक लाइव उदाहरण)। –

+0

धन्यवाद! मेरा समाधान मुझे लगता है कि मैं उम्मीद कर रहा था उससे कहीं अधिक सरल है। मैं वर्तमान में जावास्क्रिप्ट के लिए अनुमति देता है सभी अलग-अलग विविधताओं के साथ इसे आजमा रहा हूं। क्या यह किसी भी पागल विशेष पात्रों को कैप्चर करेगा जावास्क्रिप्ट अनुमति देता है (सबसे मशहूर में से एक अस्वीकृति का रूप है)? मुझे यह भी ध्यान रखना चाहिए कि यह केवल node.js पर्यावरण के लिए है, इसलिए मुझे वास्तव में केवल V8 के बारे में चिंता करने की आवश्यकता है :) –

3

क्या? के बाद * एक गैर लालची

2

मुझे आप नियमित अभिव्यक्ति का उपयोग कर सुझाव देते हैं मिल रहा है:

  • [मैच] /function[^(]*\(([^)]*)\)/ तर्क सूची से मिलान करेगा
  • [विभाजन] /\W+/ (पहला मैच डेटा के परिणामों के खिलाफ)

तो पैरामीटर सूची में मैच बंट जाएगा, कोड इस तरह दिखना चाहिए:

var s = "function moo (paramOne, paramTwo) { alert('hello'); }"; 
var s2 = s.match(/function[^(]*\(([^)]*)\)/)[1]; 
var paramList = s2.split(/\W+/); 
+0

कूल, अच्छी नौकरी +1 – iConnor

संबंधित मुद्दे